暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python实现朴素贝叶斯分类器

云南高校数据化运营管理工程中心 2019-05-03
223

目录






1.算法实现的步骤

2.python3的代码







编辑:

校对:

版本:

zhang

zhang

python3

算法实现的步骤


目的:预测糖尿病患者来自皮马人的可能性

 

算法实现

开发环境:Python3.6 ,win10

算法的实现过程分为如下几步:

(一)处理数据:导入csv数据,划分为训练集和测试集。

(二)提取数据特征:提取训练数据集的属性特征,方便我们后期计算概率并做出预测。

(三)单一预测:使用数据集的特征生成单个预测。

(四)多重预测:给定测试数据集和一个已提取特征的训练数据集生成预测。

(五)评估精度:评估对于测试数据集的预测精度作为预测正确率。


python3的代码

#算法的实现过程分为如下几步:
# (一)处理数据:从CSV文件中载入数据,然后划分为训练集和测试集。
# (二)提取数据特征:提取训练数据集的属性特征,以便我们计算概率并做出预测。
# (三)单一预测:使用数据集的特征生成单个预测。
# (四)多重预测:基于给定测试数据集和一个已提取特征的训练数据集生成预测。
# (五)评估精度:评估对于测试数据集的预测精度作为预测正确率。

# (一)处理数据:从CSV文件中载入数据,然后划分为训练集和测试集。
import csv
def loadCsv(filename):
lines = csv.reader(open(filename, "r"))
dataset = list(lines)
for i in range(len(dataset)):
dataset[i] = [float(x) for x in dataset[i]] #把每个数都转为浮点数
return dataset

#测试
filename = './data/pima-indians-diabetes.data.csv'
dataset = loadCsv(filename)
print('Loaded data file {0} with {1} rows'.format(filename, len(dataset)))
#数据里包行了768行 X 9列数据。每一行表示一个超过21岁的皮马女性糖尿病患者的信息。

# (二)提取数据特征:提取训练数据集的属性特征,以便我们计算概率并做出预测。
# 我们将数据特征的获取划分为以下的子任务:
# 1 按类别划分数据
# 2 计算均值和标准差
# 3 提取数据集特征
# 4 按类别提取属性特征
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]

#测试
dataset = [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15]]
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))

# (三、四)我们现在可以使用从训练数据中得到的摘要来做预测。
# 做预测涉及到对于给定的数据样本,计算其归属于每个类的概率,然后选择具有最大概率的类作为预测结果。
# 我们可以将这部分划分成以下任务:
# 1 计算高斯分布的概率密度函数
# 2 计算对应类的概率
# 3 单一预测
# 4 多重预测
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

#测试
dataset = [[1,20,1], [2,21,0], [3,22,1]]
separated = separateByClass(dataset)
print('Separated instances: {0}'.format(separated))


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)

#测试
numbers = [1,2,3,4,5]
print('Summary of {0}: mean={1}, stdev={2}'.format(numbers, mean(numbers), stdev(numbers)))


def summarize(dataset):
summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)]
del summaries[-1]
return summaries

dataset = [[1,20,0], [2,21,1], [3,22,0]]
summary = summarize(dataset)
print('Attribute summaries: {0}'.format(summary))


def summarizeByClass(dataset):
separated = separateByClass(dataset)
summaries = {}
for classValue, instances in separated.items():
summaries[classValue] = summarize(instances)
return summaries

dataset = [[1,20,1], [2,21,0], [3,22,1], [4,22,0]]
summary = summarizeByClass(dataset)
print('Summary by class value: {0}'.format(summary))


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

#测试
x = 71.5
mean = 73
stdev = 6.2
probability = calculateProbability(x, mean, stdev)
print('Probability of belonging to this class: {0}'.format(probability))


def calculateClassProbabilities(summaries, inputVector):
probabilities = {}
for classValue, classSummaries in summaries.items():
probabilities[classValue] = 1
for i in range(len(classSummaries)):
mean, stdev = classSummaries[i]
x = inputVector[i]
probabilities[classValue] *= calculateProbability(x, mean, stdev)
return probabilities

#测试
summaries = {0:[(1, 0.5)], 1:[(20, 5.0)]}
inputVector = [1.1, '?']
probabilities = calculateClassProbabilities(summaries, inputVector)
print('Probabilities for each class: {0}'.format(probabilities))


def predict(summaries, inputVector):
probabilities = calculateClassProbabilities(summaries, inputVector)
bestLabel, bestProb = None, -1
for classValue, probability in probabilities.items():
if bestLabel is None or probability > bestProb:
bestProb = probability
bestLabel = classValue
return bestLabel

#测试
summaries = {'A':[(1, 0.5)], 'B':[(20, 5.0)]}
inputVector = [1.1, '?']
result = predict(summaries, inputVector)
print('Prediction: {0}'.format(result))


def getPredictions(summaries, testSet):
predictions = []
for i in range(len(testSet)):
result = predict(summaries, testSet[i])
predictions.append(result)
return predictions

#测试
summaries = {'A':[(1, 0.5)], 'B':[(20, 5.0)]}
testSet = [[1.1, '?'], [19.1, '?']]
predictions = getPredictions(summaries, testSet)
print('Predictions: {0}'.format(predictions))


# (五)评估精度:评估对于测试数据集的预测精度作为预测正确率。
# 预测值和测试数据集中的类别值进行比较,可以计算得到一个介于0%~100%精确率作为分类的精确度。
# getAccuracy()函数可以计算出这个精确率。
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
#测试
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))


思考——学而不思则罔

现在你能独立复现上述的结果吗?回复“数据”,即可领取数据集,赶紧行动吧!


理解编程语言,探索数据奥秘

每日练习|干货分享|新闻资讯|公益平台。

每天学习一点点,你将会见到全新的自己。

长按识别二维码关注


文章转载自云南高校数据化运营管理工程中心,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论