
用Python從零實(shí)現(xiàn)貝葉斯分類器的機(jī)器學(xué)習(xí)的教程
關(guān)于樸素貝葉斯
樸素貝葉斯算法是一個(gè)直觀的方法,使用每個(gè)屬性歸屬于某個(gè)類的概率來做預(yù)測。你可以使用這種監(jiān)督性學(xué)習(xí)方法,對(duì)一個(gè)預(yù)測性建模問題進(jìn)行概率建模。
給定一個(gè)類,樸素貝葉斯假設(shè)每個(gè)屬性歸屬于此類的概率獨(dú)立于其余所有屬性,從而簡化了概率的計(jì)算。這種強(qiáng)假定產(chǎn)生了一個(gè)快速、有效的方法。
給定一個(gè)屬性值,其屬于某個(gè)類的概率叫做條件概率。對(duì)于一個(gè)給定的類值,將每個(gè)屬性的條件概率相乘,便得到一個(gè)數(shù)據(jù)樣本屬于某個(gè)類的概率。
我們可以通過計(jì)算樣本歸屬于每個(gè)類的概率,然后選擇具有最高概率的類來做預(yù)測。
通常,我們使用分類數(shù)據(jù)來描述樸素貝葉斯,因?yàn)檫@樣容易通過比率來描述、計(jì)算。一個(gè)符合我們目的、比較有用的算法需要支持?jǐn)?shù)值屬性,同時(shí)假設(shè)每一個(gè)數(shù)值屬性服從正態(tài)分布(分布在一個(gè)鐘形曲線上),這又是一個(gè)強(qiáng)假設(shè),但是依然能夠給出一個(gè)健壯的結(jié)果。
預(yù)測糖尿病的發(fā)生
本文使用的測試問題是“皮馬印第安人糖尿病問題”。
這個(gè)問題包括768個(gè)對(duì)于皮馬印第安患者的醫(yī)療觀測細(xì)節(jié),記錄所描述的瞬時(shí)測量取自諸如患者的年紀(jì),懷孕和血液檢查的次數(shù)。所有患者都是21歲以上(含21歲)的女性,所有屬性都是數(shù)值型,而且屬性的單位各不相同。
每一個(gè)記錄歸屬于一個(gè)類,這個(gè)類指明以測量時(shí)間為止,患者是否是在5年之內(nèi)感染的糖尿病。如果是,則為1,否則為0。
機(jī)器學(xué)習(xí)文獻(xiàn)中已經(jīng)多次研究了這個(gè)標(biāo)準(zhǔn)數(shù)據(jù)集,好的預(yù)測精度為70%-76%。
下面是pima-indians.data.csv文件中的一個(gè)樣本,了解一下我們將要使用的數(shù)據(jù)。
注意:下載文件,然后以.csv擴(kuò)展名保存(如:pima-indians-diabetes.data.csv)。查看文件中所有屬性的描述。
6,148,72,35,0,33.6,0.627,50,1
1,85,66,29,0,26.6,0.351,31,0
8,183,64,0,0,23.3,0.672,32,1
1,89,66,23,94,28.1,0.167,21,0
0,137,40,35,168,43.1,2.288,33,1
樸素貝葉斯算法教程
教程分為如下幾步:
1.處理數(shù)據(jù):從CSV文件中載入數(shù)據(jù),然后劃分為訓(xùn)練集和測試集。
2.提取數(shù)據(jù)特征:提取訓(xùn)練數(shù)據(jù)集的屬性特征,以便我們計(jì)算概率并做出預(yù)測。
3.單一預(yù)測:使用數(shù)據(jù)集的特征生成單個(gè)預(yù)測。
4.多重預(yù)測:基于給定測試數(shù)據(jù)集和一個(gè)已提取特征的訓(xùn)練數(shù)據(jù)集生成預(yù)測。
5.評(píng)估精度:評(píng)估對(duì)于測試數(shù)據(jù)集的預(yù)測精度作為預(yù)測正確率。
6.合并代碼:使用所有代碼呈現(xiàn)一個(gè)完整的、獨(dú)立的樸素貝葉斯算法的實(shí)現(xiàn)。
1.處理數(shù)據(jù)
首先加載數(shù)據(jù)文件。CSV格式的數(shù)據(jù)沒有標(biāo)題行和任何引號(hào)。我們可以使用csv模塊中的open函數(shù)打開文件,使用reader函數(shù)讀取行數(shù)據(jù)。
我們也需要將以字符串類型加載進(jìn)來屬性轉(zhuǎn)換為我們可以使用的數(shù)字。下面是用來加載匹馬印第安人數(shù)據(jù)集(Pima indians dataset)的loadCsv()函數(shù)。
import csv
def loadCsv(filename):
lines = csv.reader(open(filename, "rb"))
dataset = list(lines)
for i in range(len(dataset)):
dataset[i] = [float(x) for x in dataset[i]]
return dataset
我們可以通過加載皮馬印第安人數(shù)據(jù)集,然后打印出數(shù)據(jù)樣本的個(gè)數(shù),以此測試這個(gè)函數(shù)。
filename = 'pima-indians-diabetes.data.csv'
dataset = loadCsv(filename)
print('Loaded data file {0} with {1} rows').format(filename, len(dataset))
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Loaded data file iris.data.csv with 150 rows
下一步,我們將數(shù)據(jù)分為用于樸素貝葉斯預(yù)測的訓(xùn)練數(shù)據(jù)集,以及用來評(píng)估模型精度的測試數(shù)據(jù)集。我們需要將數(shù)據(jù)集隨機(jī)分為包含67%的訓(xùn)練集合和包含33%的測試集(這是在此數(shù)據(jù)集上測試算法的通常比率)。
下面是splitDataset()函數(shù),它以給定的劃分比例將數(shù)據(jù)集進(jìn)行劃分。
import random
def splitDataset(dataset, splitRatio):
trainSize = int(len(dataset) * splitRatio)
trainSet = []
copy = list(dataset)
while len(trainSet) < trainSize:
index = random.randrange(len(copy))
trainSet.append(copy.pop(index))
return [trainSet, copy]
我們可以定義一個(gè)具有5個(gè)樣例的數(shù)據(jù)集來進(jìn)行測試,首先它分為訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集,然后打印出來,看看每個(gè)數(shù)據(jù)樣本最終落在哪個(gè)數(shù)據(jù)集。
dataset = [[1], [2], [3], [4], [5]]
splitRatio = 0.67
train, test = splitDataset(dataset, splitRatio)
print('Split {0} rows into train with {1} and test with {2}').format(len(dataset), train, test)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Split 5 rows into train with [[4], [3], [5]] and test with [[1], [2]]
提取數(shù)據(jù)特征
樸素貝葉斯模型包含訓(xùn)練數(shù)據(jù)集中數(shù)據(jù)的特征,然后使用這個(gè)數(shù)據(jù)特征來做預(yù)測。
所收集的訓(xùn)練數(shù)據(jù)的特征,包含相對(duì)于每個(gè)類的每個(gè)屬性的均值和標(biāo)準(zhǔn)差。舉例來說,如果如果有2個(gè)類和7個(gè)數(shù)值屬性,然后我們需要每一個(gè)屬性(7)和類(2)的組合的均值和標(biāo)準(zhǔn)差,也就是14個(gè)屬性特征。
在對(duì)特定的屬性歸屬于每個(gè)類的概率做計(jì)算、預(yù)測時(shí),將用到這些特征。
我們將數(shù)據(jù)特征的獲取劃分為以下的子任務(wù):
按類別劃分?jǐn)?shù)據(jù)
計(jì)算均值
計(jì)算標(biāo)準(zhǔn)差
提取數(shù)據(jù)集特征
按類別提取屬性特征
按類別劃分?jǐn)?shù)據(jù)
首先將訓(xùn)練數(shù)據(jù)集中的樣本按照類別進(jìn)行劃分,然后計(jì)算出每個(gè)類的統(tǒng)計(jì)數(shù)據(jù)。我們可以創(chuàng)建一個(gè)類別到屬于此類別的樣本列表的的映射,并將整個(gè)數(shù)據(jù)集中的樣本分類到相應(yīng)的列表。
下面的SeparateByClass()函數(shù)可以完成這個(gè)任務(wù):
def separateByClass(dataset):
separated = {}
for i in range(len(dataset)):
vector = dataset[i]
if (vector[-1] not in separated):
separated[vector[-1]] = []
separated[vector[-1]].append(vector)
return separated
可以看出,函數(shù)假設(shè)樣本中最后一個(gè)屬性(-1)為類別值,返回一個(gè)類別值到數(shù)據(jù)樣本列表的映射。
我們可以用一些樣本數(shù)據(jù)測試如下:
dataset = [[1,20,1], [2,21,0], [3,22,1]]
separated = separateByClass(dataset)
print('Separated instances: {0}').format(separated)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Separated instances: {0: [[2, 21, 0]], 1: [[1, 20, 1], [3, 22, 1]]}
計(jì)算均值
我們需要計(jì)算在每個(gè)類中每個(gè)屬性的均值。均值是數(shù)據(jù)的中點(diǎn)或者集中趨勢,在計(jì)算概率時(shí),我們用它作為高斯分布的中值。
我們也需要計(jì)算每個(gè)類中每個(gè)屬性的標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)差描述了數(shù)據(jù)散布的偏差,在計(jì)算概率時(shí),我們用它來刻畫高斯分布中,每個(gè)屬性所期望的散布。
標(biāo)準(zhǔn)差是方差的平方根。方差是每個(gè)屬性值與均值的離差平方的平均數(shù)。注意我們使用N-1的方法(譯者注:參見無偏估計(jì)),也就是在在計(jì)算方差時(shí),屬性值的個(gè)數(shù)減1。
import math
def mean(numbers):
return sum(numbers)/float(len(numbers))
def stdev(numbers):
avg = mean(numbers)
variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1)
return math.sqrt(variance)
通過計(jì)算從1到5這5個(gè)數(shù)的均值來測試函數(shù)。
numbers = [1,2,3,4,5]
print('Summary of {0}: mean={1}, stdev={2}').format(numbers, mean(numbers), stdev(numbers))
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Summary of [1, 2, 3, 4, 5]: mean=3.0, stdev=1.58113883008
提取數(shù)據(jù)集的特征
現(xiàn)在我們可以提取數(shù)據(jù)集特征。對(duì)于一個(gè)給定的樣本列表(對(duì)應(yīng)于某個(gè)類),我們可以計(jì)算每個(gè)屬性的均值和標(biāo)準(zhǔn)差。
zip函數(shù)將數(shù)據(jù)樣本按照屬性分組為一個(gè)個(gè)列表,然后可以對(duì)每個(gè)屬性計(jì)算均值和標(biāo)準(zhǔn)差。
def summarize(dataset):
summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)]
del summaries[-1]
return summaries
我們可以使用一些測試數(shù)據(jù)來測試這個(gè)summarize()函數(shù),測試數(shù)據(jù)對(duì)于第一個(gè)和第二個(gè)數(shù)據(jù)屬性的均值和標(biāo)準(zhǔn)差顯示出顯著的不同。
dataset = [[1,20,0], [2,21,1], [3,22,0]]
summary = summarize(dataset)
print('Attribute summaries: {0}').format(summary)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Attribute summaries: [(2.0, 1.0), (21.0, 1.0)]
按類別提取屬性特征
合并代碼,我們首先將訓(xùn)練數(shù)據(jù)集按照類別進(jìn)行劃分,然后計(jì)算每個(gè)屬性的摘要。
def summarizeByClass(dataset):
separated = separateByClass(dataset)
summaries = {}
for classValue, instances in separated.iteritems():
summaries[classValue] = summarize(instances)
return summaries
使用小的測試數(shù)據(jù)集來測試summarizeByClass()函數(shù)。
dataset = [[1,20,1], [2,21,0], [3,22,1], [4,22,0]]
summary = summarizeByClass(dataset)
print('Summary by class value: {0}').format(summary)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Summary by class value:
{0: [(3.0, 1.4142135623730951), (21.5, 0.7071067811865476)],
1: [(2.0, 1.4142135623730951), (21.0, 1.4142135623730951)]}
預(yù)測
我們現(xiàn)在可以使用從訓(xùn)練數(shù)據(jù)中得到的摘要來做預(yù)測。做預(yù)測涉及到對(duì)于給定的數(shù)據(jù)樣本,計(jì)算其歸屬于每個(gè)類的概率,然后選擇具有最大概率的類作為預(yù)測結(jié)果。
我們可以將這部分劃分成以下任務(wù):
計(jì)算高斯概率密度函數(shù)
計(jì)算對(duì)應(yīng)類的概率
單一預(yù)測
評(píng)估精度
計(jì)算高斯概率密度函數(shù)
給定來自訓(xùn)練數(shù)據(jù)中已知屬性的均值和標(biāo)準(zhǔn)差,我們可以使用高斯函數(shù)來評(píng)估一個(gè)給定的屬性值的概率。
已知每個(gè)屬性和類值的屬性特征,在給定類值的條件下,可以得到給定屬性值的條件概率。
關(guān)于高斯概率密度函數(shù),可以查看參考文獻(xiàn)??傊?,我們要把已知的細(xì)節(jié)融入到高斯函數(shù)(屬性值,均值,標(biāo)準(zhǔn)差),并得到屬性值歸屬于某個(gè)類的似然(譯者注:即可能性)。
在calculateProbability()函數(shù)中,我們首先計(jì)算指數(shù)部分,然后計(jì)算等式的主干。這樣可以將其很好地組織成2行。
import math
def calculateProbability(x, mean, stdev):
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
使用一些簡單的數(shù)據(jù)測試如下:
x = 71.5
mean = 73
stdev = 6.2
probability = calculateProbability(x, mean, stdev)
print('Probability of belonging to this class: {0}').format(probability)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Probability of belonging to this class: 0.0624896575937
計(jì)算所屬類的概率
既然我們可以計(jì)算一個(gè)屬性屬于某個(gè)類的概率,那么合并一個(gè)數(shù)據(jù)樣本中所有屬性的概率,最后便得到整個(gè)數(shù)據(jù)樣本屬于某個(gè)類的概率。
使用乘法合并概率,在下面的calculClassProbilities()函數(shù)中,給定一個(gè)數(shù)據(jù)樣本,它所屬每個(gè)類別的概率,可以通過將其屬性概率相乘得到。結(jié)果是一個(gè)類值到概率的映射。
def calculateClassProbabilities(summaries, inputVector):
probabilities = {}
for classValue, classSummaries in summaries.iteritems():
probabilities[classValue] = 1
for i in range(len(classSummaries)):
mean, stdev = classSummaries[i]
x = inputVector[i]
probabilities[classValue] *= calculateProbability(x, mean, stdev)
return probabilities
測試calculateClassProbabilities()函數(shù)。
summaries = {0:[(1, 0.5)], 1:[(20, 5.0)]}
inputVector = [1.1, '?']
probabilities = calculateClassProbabilities(summaries, inputVector)
print('Probabilities for each class: {0}').format(probabilities)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Probabilities for each class: {0: 0.7820853879509118, 1: 6.298736258150442e-05}
單一預(yù)測
既然可以計(jì)算一個(gè)數(shù)據(jù)樣本屬于每個(gè)類的概率,那么我們可以找到最大的概率值,并返回關(guān)聯(lián)的類。
下面的predict()函數(shù)可以完成以上任務(wù)。
def predict(summaries, inputVector):
probabilities = calculateClassProbabilities(summaries, inputVector)
bestLabel, bestProb = None, -1
for classValue, probability in probabilities.iteritems():
if bestLabel is None or probability > bestProb:
bestProb = probability
bestLabel = classValue
return bestLabel
測試predict()函數(shù)如下:
summaries = {'A':[(1, 0.5)], 'B':[(20, 5.0)]}
inputVector = [1.1, '?']
result = predict(summaries, inputVector)
print('Prediction: {0}').format(result)
運(yùn)行測試,你會(huì)得到如下結(jié)果:
Prediction: A
多重預(yù)測
最后,通過對(duì)測試數(shù)據(jù)集中每個(gè)數(shù)據(jù)樣本的預(yù)測,我們可以評(píng)估模型精度。getPredictions()函數(shù)可以實(shí)現(xiàn)這個(gè)功能,并返回每個(gè)測試樣本的預(yù)測列表。
def getPredictions(summaries, testSet):
predictions = []
for i in range(len(testSet)):
result = predict(summaries, testSet[i])
predictions.append(result)
return predictions
測試getPredictions()函數(shù)如下。
summaries = {'A':[(1, 0.5)], 'B':[(20, 5.0)]}
testSet = [[1.1, '?'], [19.1, '?']]
predictions = getPredictions(summaries, testSet)
print('Predictions: {0}').format(predictions)
運(yùn)行測試,你會(huì)看到如下結(jié)果:
Predictions: ['A', 'B']
計(jì)算精度
預(yù)測值和測試數(shù)據(jù)集中的類別值進(jìn)行比較,可以計(jì)算得到一個(gè)介于0%~100%精確率作為分類的精確度。getAccuracy()函數(shù)可以計(jì)算出這個(gè)精確率。
def getAccuracy(testSet, predictions):
correct = 0
for x in range(len(testSet)):
if testSet[x][-1] == predictions[x]:
correct += 1
return (correct/float(len(testSet))) * 100.0
我們可以使用如下簡單的代碼來測試getAccuracy()函數(shù)。
testSet = [[1,1,1,'a'], [2,2,2,'a'], [3,3,3,'b']]
predictions = ['a', 'a', 'a']
accuracy = getAccuracy(testSet, predictions)
print('Accuracy: {0}').format(accuracy)
運(yùn)行測試,你會(huì)得到如下結(jié)果:
Accuracy: 66.6666666667
合并代碼
最后,我們需要將代碼連貫起來。
下面是樸素貝葉斯Python版的逐步實(shí)現(xiàn)的全部代碼。
# Example of Naive Bayes implemented from Scratch in Python
import csv
import random
import math
def loadCsv(filename):
lines = csv.reader(open(filename, "rb"))
dataset = list(lines)
for i in range(len(dataset)):
dataset[i] = [float(x) for x in dataset[i]]
return dataset
def splitDataset(dataset, splitRatio):
trainSize = int(len(dataset) * splitRatio)
trainSet = []
copy = list(dataset)
while len(trainSet) < trainSize:
index = random.randrange(len(copy))
trainSet.append(copy.pop(index))
return [trainSet, copy]
def separateByClass(dataset):
separated = {}
for i in range(len(dataset)):
vector = dataset[i]
if (vector[-1] not in separated):
separated[vector[-1]] = []
separated[vector[-1]].append(vector)
return separated
def mean(numbers):
return sum(numbers)/float(len(numbers))
def stdev(numbers):
avg = mean(numbers)
variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1)
return math.sqrt(variance)
def summarize(dataset):
summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)]
del summaries[-1]
return summaries
def summarizeByClass(dataset):
separated = separateByClass(dataset)
summaries = {}
for classValue, instances in separated.iteritems():
summaries[classValue] = summarize(instances)
return summaries
def calculateProbability(x, mean, stdev):
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
def calculateClassProbabilities(summaries, inputVector):
probabilities = {}
for classValue, classSummaries in summaries.iteritems():
probabilities[classValue] = 1
for i in range(len(classSummaries)):
mean, stdev = classSummaries[i]
x = inputVector[i]
probabilities[classValue] *= calculateProbability(x, mean, stdev)
return probabilities
def predict(summaries, inputVector):
probabilities = calculateClassProbabilities(summaries, inputVector)
bestLabel, bestProb = None, -1
for classValue, probability in probabilities.iteritems():
if bestLabel is None or probability > bestProb:
bestProb = probability
bestLabel = classValue
return bestLabel
def getPredictions(summaries, testSet):
predictions = []
for i in range(len(testSet)):
result = predict(summaries, testSet[i])
predictions.append(result)
return predictions
def getAccuracy(testSet, predictions):
correct = 0
for i in range(len(testSet)):
if testSet[i][-1] == predictions[i]:
correct += 1
return (correct/float(len(testSet))) * 100.0
def main():
filename = 'pima-indians-diabetes.data.csv'
splitRatio = 0.67
dataset = loadCsv(filename)
trainingSet, testSet = splitDataset(dataset, splitRatio)
print('Split {0} rows into train={1} and test={2} rows').format(len(dataset), len(trainingSet), len(testSet))
# prepare model
summaries = summarizeByClass(trainingSet)
# test model
predictions = getPredictions(summaries, testSet)
accuracy = getAccuracy(testSet, predictions)
print('Accuracy: {0}%').format(accuracy)
main()
運(yùn)行示例,得到如下輸出:
Split 768 rows into train=514 and test=254 rows
Accuracy: 76.3779527559%
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10