Python实现贝叶斯分类器Word文档格式.docx
- 文档编号:17932053
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:19
- 大小:23.98KB
Python实现贝叶斯分类器Word文档格式.docx
《Python实现贝叶斯分类器Word文档格式.docx》由会员分享,可在线阅读,更多相关《Python实现贝叶斯分类器Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
提取训练数据集的属性特征,以便我们计算概率并做出预测。
3.单一预测:
使用数据集的特征生成单个预测。
4.多重预测:
基于给定测试数据集和一个已提取特征的训练数据集生成预测。
5.评估精度:
评估对于测试数据集的预测精度作为预测正确率。
6.合并代码:
使用所有代码呈现一个完整的、独立的朴素贝叶斯算法的实现。
1.处理数据
首先加载数据文件。
CSV格式的数据没有标题行和任何引号。
我们可以使用csv模块中的open函数打开文件,使用reader函数读取行数据。
我们也需要将以字符串类型加载进来属性转换为我们可以使用的数字。
下面是用来加载匹马印第安人数据集(Pimaindiansdataset)的loadCsv()函数。
6
7
importcsv
defloadCsv(filename):
lines=csv.reader(open(filename,"
rb"
))
dataset=list(lines)
foriinrange(len(dataset)):
dataset[i]=[float(x)forxindataset[i]]
returndataset
我们可以通过加载皮马印第安人数据集,然后打印出数据样本的个数,以此测试这个函数。
filename='
pima-indians-diabetes.data.csv'
dataset=loadCsv(filename)
print('
Loadeddatafile{0}with{1}rows'
).format(filename,len(dataset))
运行测试,你会看到如下结果:
Loadeddatafileiris.data.csvwith150rows
下一步,我们将数据分为用于朴素贝叶斯预测的训练数据集,以及用来评估模型精度的测试数据集。
我们需要将数据集随机分为包含67%的训练集合和包含33%的测试集(这是在此数据集上测试算法的通常比率)。
下面是splitDataset()函数,它以给定的划分比例将数据集进行划分。
8
9
importrandom
defsplitDataset(dataset,splitRatio):
trainSize=int(len(dataset)*splitRatio)
trainSet=[]
copy=list(dataset)
whilelen(trainSet)<
trainSize:
index=random.randrange(len(copy))
trainSet.append(copy.pop(index))
return[trainSet,copy]
我们可以定义一个具有5个样例的数据集来进行测试,首先它分为训练数据集和测试数据集,然后打印出来,看看每个数据样本最终落在哪个数据集。
dataset=[[1],[2],[3],[4],[5]]
splitRatio=0.67
train,test=splitDataset(dataset,splitRatio)
Split{0}rowsintotrainwith{1}andtestwith{2}'
).format(len(dataset),train,test)
Split5rowsintotrainwith[[4],[3],[5]]andtestwith[[1],[2]]
提取数据特征
朴素贝叶斯模型包含训练数据集中数据的特征,然后使用这个数据特征来做预测。
所收集的训练数据的特征,包含相对于每个类的每个属性的均值和标准差。
举例来说,如果如果有2个类和7个数值属性,然后我们需要每一个属性(7)和类
(2)的组合的均值和标准差,也就是14个属性特征。
在对特定的属性归属于每个类的概率做计算、预测时,将用到这些特征。
我们将数据特征的获取划分为以下的子任务:
1.按类别划分数据
2.计算均值
3.计算标准差
4.提取数据集特征
5.按类别提取属性特征
按类别划分数据
首先将训练数据集中的样本按照类别进行划分,然后计算出每个类的统计数据。
我们可以创建一个类别到属于此类别的样本列表的的映射,并将整个数据集中的样本分类到相应的列表。
下面的SeparateByClass()函数可以完成这个任务:
defseparateByClass(dataset):
separated={}
vector=dataset[i]
if(vector[-1]notinseparated):
separated[vector[-1]]=[]
separated[vector[-1]].append(vector)
returnseparated
可以看出,函数假设样本中最后一个属性(-1)为类别值,返回一个类别值到数据样本列表的映射。
我们可以用一些样本数据测试如下:
dataset=[[1,20,1],[2,21,0],[3,22,1]]
separated=separateByClass(dataset)
Separatedinstances:
{0}'
).format(separated)
{0:
[[2,21,0]],1:
[[1,20,1],[3,22,1]]}
计算均值
我们需要计算在每个类中每个属性的均值。
均值是数据的中点或者集中趋势,在计算概率时,我们用它作为高斯分布的中值。
我们也需要计算每个类中每个属性的标准差。
标准差描述了数据散布的偏差,在计算概率时,我们用它来刻画高斯分布中,每个属性所期望的散布。
标准差是方差的平方根。
方差是每个属性值与均值的离差平方的平均数。
注意我们使用N-1的方法(译者注:
参见无偏估计),也就是在在计算方差时,属性值的个数减1。
importmath
defmean(numbers):
returnsum(numbers)/float(len(numbers))
defstdev(numbers):
avg=mean(numbers)
variance=sum([pow(x-avg,2)forxinnumbers])/float(len(numbers)-1)
returnmath.sqrt(variance)
通过计算从1到5这5个数的均值来测试函数。
numbers=[1,2,3,4,5]
Summaryof{0}:
mean={1},stdev={2}'
).format(numbers,mean(numbers),stdev(numbers))
Summaryof[1,2,3,4,5]:
mean=3.0,stdev=1.58113883008
提取数据集的特征
现在我们可以提取数据集特征。
对于一个给定的样本列表(对应于某个类),我们可以计算每个属性的均值和标准差。
zip函数将数据样本按照属性分组为一个个列表,然后可以对每个属性计算均值和标准差。
defsummarize(dataset):
summaries=[(mean(attribute),stdev(attribute))forattributeinzip(*dataset)]
delsummaries[-1]
returnsummaries
我们可以使用一些测试数据来测试这个summarize()函数,测试数据对于第一个和第二个数据属性的均值和标准差显示出显著的不同。
dataset=[[1,20,0],[2,21,1],[3,22,0]]
summary=summarize(dataset)
Attributesummaries:
).format(summary)
[(2.0,1.0),(21.0,1.0)]
按类别提取属性特征
合并代码,我们首先将训练数据集按照类别进行划分,然后计算每个属性的摘要。
defsummarizeByClass(dataset):
separated=separateByClass(dataset)
summaries={}
forclassValue,instancesinseparated.iteritems():
summaries[classValue]=summarize(instances)
使用小的测试数据集来测试summarizeByClass()函数。
dataset=[[1,20,1],[2,21,0],[3,22,1],[4,22,0]]
summary=summarizeByClass(dataset)
Summarybyclassvalue:
{0:
[(3.0,1.4142135623730951),(21.5,0.7071067811865476)],
1:
[(2.0,1.4142135623730951),(21.0,1.4142135623730951)]}
预测
我们现在可以使用从训练数据中得到的摘要来做预测。
做预测涉及到对于给定的数据样本,计算其归属于每个类的概率,然后选择具有最大概率的类作为预测结果。
我们可以将这部分划分成以下任务:
1.计算高斯概率密度函数
2.计算对应类的概率
3.单一预测
4.评估精度
计算高斯概率密度函数
给定来自训练数据中已知属性的均值和标准差,我们可以使用高斯函数来评估一个给定的属性值的概率。
已知每个属性和类值的属性特征,在给定类值的条件下,可以得到给定属性值的条件概率。
关于高斯概率密度函数,可以查看参考文献。
总之,我们要把已知的细节融入到高斯函数(属性值,均值,标准差),并得到属性值归属于某个类的似然(译者注:
即可能性)。
在calculateProbability()函数中,我们首先计算指数部分,然后计算等式的主干。
这样可以将其很好地组织成2行。
defcalculateProbability(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)
Probabilityofbelongingtothisclass:
).format(probability)
0.0624896575937
计算所属类的概率
既然我们可以计算一个属性属于某个类的概率,那么合并一个数据样本中所有属性的概率,最后便得到整个数据样本属于某个类的概率。
使用乘法合并概率,在下面的calculClassProbilities()函数中,给定一个数据样本,它所属每个类别的概率,可以通过将其属性概率相乘得到。
结果是一个类值到概率的映射。
defcalculateClassProbabilities(summaries,inputVector):
probabilities={}
forclassValue,classSummariesinsummaries.iteritems():
probabilities[classValue]=1
foriinrange(len(classSummaries)):
mean,stdev=classSummaries[i]
x=inputVector[i]
probabilities[classValue]*=calculateProbability(x,mean,stdev)
returnprobabilities
测试calculateClassProbabilities()函数。
summaries={0:
[(1,0.5)],1:
[(20,5.0)]}
inputVector=[1.1,'
?
'
]
probabilities=calculateClassProbabilities(summaries,inputVector)
Probabilitiesforeachclass:
).format(probabilities)
0.7820853879509118,1:
6.298736258150442e-05}
单一预测
既然可以计算一个数据样本属于每个类的概率,那么我们可以找到最大的概率值,并返回关联的类。
下面的predict()函数可以完成以上任务。
defpredict(summaries,inputVector):
probabilities=calculateClassProbabilities(summaries,inputVector)
bestLabel,bestProb=None,-1
forclassValue,probabilityinprobabilities.iteritems():
ifbestLabelisNoneorprobability>
bestProb:
bestProb=probability
bestLabel=classValue
returnbestLabel
测试predict()函数如下:
summaries={'
A'
:
[(1,0.5)],'
B'
result=predict(summaries,inputVector)
Prediction:
).format(result)
运行测试,你会得到如下结果:
A
多重预测
最后,通过对测试数据集中每个数据样本的预测,我们可以评估模型精度。
getPredictions()函数可以实现这个功能,并返回每个测试样本的预测列表。
defgetPredictions(summaries,testSet):
predictions=[]
foriinrange(len(testSet)):
result=predict(summaries,testSet[i])
predictions.append(result)
returnpredictions
测试getPredictions()函数如下。
testSet=[[1.1,'
],[19.1,'
]]
predictions=getPredictions(summaries,testSet)
Predictions:
).format(predictions)
['
'
计算精度
预测值和测试数据集中的类别值进行比较,可以计算得到一个介于0%~100%精确率作为分类的精确度。
getAccuracy()函数可以计算出这个精确率。
defgetAccuracy(testSet,predictions):
correct=0
forxinrange(len(testSet)):
iftestSet[x][-1]==predictions[x]:
correct+=1
return(correct/float(len(testSet)))*100.0
我们可以使用如下简单的代码来测试getAccuracy()函数。
testSet=[[1,1,1,'
a'
],[2,2,2,'
],[3,3,3,'
b'
predictions=['
accuracy=getAccuracy(testSet,predictions)
Accuracy:
).format(accuracy)
66.6666666667
合并代码
最后,我们需要将代码连贯起来。
下面是朴素贝叶斯Python版的逐步实现的全部代码。
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ExampleofNaiveBayesimplementedfromScratchinPython
f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 实现 贝叶斯 分类
![提示](https://static.bdocx.com/images/bang_tan.gif)