收藏 分享(赏)

机器学习之用Python从零实现贝叶斯分类器.docx

上传人:gnk289057 文档编号:6213161 上传时间:2019-04-02 格式:DOCX 页数:17 大小:136.07KB
下载 相关 举报
机器学习之用Python从零实现贝叶斯分类器.docx_第1页
第1页 / 共17页
机器学习之用Python从零实现贝叶斯分类器.docx_第2页
第2页 / 共17页
机器学习之用Python从零实现贝叶斯分类器.docx_第3页
第3页 / 共17页
机器学习之用Python从零实现贝叶斯分类器.docx_第4页
第4页 / 共17页
机器学习之用Python从零实现贝叶斯分类器.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、机器学习之用 Python 从零实现贝叶斯分类器关于朴素贝叶斯朴素贝叶斯算法是一个直观的方法,使用每个属性归属于某个类的概率来做预测。你可以使用这种监督性学习方法,对一个预测性建模问题进行概率建模。给定一个类,朴素贝叶斯假设每个属性归属于此类的概率独立于其余所有属性,从而简化了概率的计算。这种强假定产生了一个快速、有效的方法。给定一个属性值,其属于某个类的概率叫做条件概率。对于一个给定的类值,将每个属性的条件概率相乘,便得到一个数据样本属于某个类的概率。我们可以通过计算样本归属于每个类的概率,然后选择具有最高概率的类来做预测。通常,我们使用分类数据来描述朴素贝叶斯,因为这样容易通过比率来描述、

2、计算。一个符合我们目的、比较有用的算法需要支持数值属性,同时假设每一个数值属性服从正态分布(分布在一个钟形曲线上),这又是一个强假设,但是依然能够给出一个健壮的结果。预测糖尿病的发生本文使用的测试问题是“皮马印第安人糖尿病问题”。这个问题包括 768 个对于皮马印第安患者的医疗观测细节,记录所描述的瞬时测量取自诸如患者的年纪,怀孕和血液检查的次数。所有患者都是 21 岁以上(含21 岁)的女性,所有属性都是数值型,而且属性的单位各不相同。每一个记录归属于一个类,这个类指明以测量时间为止,患者是否是在 5 年之内感染的糖尿病。如果是,则为 1,否则为 0。机器学习文献中已经多次研究了这个标准数据

3、集,好的预测精度为 70%-76%。下面是 pima-indians.data.csv 文件中的一个样本,了解一下我们将要使用的数据。注意:下载文件,然后以.csv 扩展名保存(如:pima-indians-diabetes.data.csv)。查看文件中所有属性的描述。Python123456,148,72,35,0,33.6,0.627,50,11,85,66,29,0,26.6,0.351,31,08,183,64,0,0,23.3,0.672,32,11,89,66,23,94,28.1,0.167,21,00,137,40,35,168,43.1,2.288,33,1朴素贝叶斯算法教

4、程教程分为如下几步:1.处理数据:从 CSV 文件中载入数据,然后划分为训练集和测试集。2.提取数据特征:提取训练数据集的属性特征,以便我们计算概率并做出预测。3.单一预测:使用数据集的特征生成单个预测。4.多重预测:基于给定测试数据集和一个已提取特征的训练数据集生成预测。5.评估精度:评估对于测试数据集的预测精度作为预测正确率。6.合并代码:使用所有代码呈现一个完整的、独立的朴素贝叶斯算法的实现。1.处理数据首先加载数据文件。CSV 格式的数据没有标题行和任何引号。我们可以使用 csv模块中的 open 函数打开文件,使用 reader 函数读取行数据。我们也需要将以字符串类型加载进来属性转

5、换为我们可以使用的数字。下面是用来加载匹马印第安人数据集(Pima indians dataset)的 loadCsv()函数。Python1234567import csvdef loadCsv(filename):lines = csv.reader(open(filename, “rb“)dataset = list(lines)for i in range(len(dataset):dataseti = float(x) for x in datasetireturn dataset我们可以通过加载皮马印第安人数据集,然后打印出数据样本的个数,以此测试这个函数。Python123fil

6、ename = pima-indians-diabetes.data.csvdataset = loadCsv(filename)print(Loaded data file 0 with 1 rows).format(filename, len(dataset)运行测试,你会看到如下结果:Python1 Loaded data file iris.data.csv with 150 rows下一步,我们将数据分为用于朴素贝叶斯预测的训练数据集,以及用来评估模型精度的测试数据集。我们需要将数据集随机分为包含 67%的训练集合和包含 33%的测试集(这是在此数据集上测试算法的通常比率)。下面是

7、splitDataset()函数,它以给定的划分比例将数据集进行划分。Python123456789import randomdef splitDataset(dataset, splitRatio):trainSize = int(len(dataset) * splitRatio)trainSet = copy = list(dataset)while len(trainSet) bestProb:bestProb = probabilitybestLabel = classValuereturn bestLabel测试 predict()函数如下:Python1234summaries

8、= A:(1, 0.5), B:(20, 5.0)inputVector = 1.1, ?result = predict(summaries, inputVector)print(Prediction: 0).format(result)运行测试,你会得到如下结果:Python1 Prediction: A多重预测最后,通过对测试数据集中每个数据样本的预测,我们可以评估模型精度。getPredictions()函数可以实现这个功能,并返回每个测试样本的预测列表。Python1234def getPredictions(summaries, testSet):predictions = for

9、 i in range(len(testSet):result = predict(summaries, testSeti)56predictions.append(result)return predictions测试 getPredictions()函数如下。Python1234summaries = A:(1, 0.5), B:(20, 5.0)testSet = 1.1, ?, 19.1, ?predictions = getPredictions(summaries, testSet)print(Predictions: 0).format(predictions)运行测试,你会看到

10、如下结果:Python1 Predictions: A, B计算精度预测值和测试数据集中的类别值进行比较,可以计算得到一个介于 0%100%精确率作为分类的精确度。getAccuracy()函数可以计算出这个精确率。Python123456def getAccuracy(testSet, predictions):correct = 0for x in range(len(testSet):if testSetx-1 = predictionsx:correct += 1return (correct/float(len(testSet) * 100.0我们可以使用如下简单的代码来测试 get

11、Accuracy()函数。Python1234testSet = 1,1,1,a, 2,2,2,a, 3,3,3,bpredictions = a, a, aaccuracy = getAccuracy(testSet, predictions)print(Accuracy: 0).format(accuracy)运行测试,你会得到如下结果:Python1 Accuracy: 66.6666666667合并代码最后,我们需要将代码连贯起来。下面是朴素贝叶斯 Python 版的逐步实现的全部代码。Python12345678910111213141516171819202122232425262

12、7282930313233# Example of Naive Bayes implemented from Scratch in Pythonimport csvimport randomimport mathdef loadCsv(filename):lines = csv.reader(open(filename, “rb“)dataset = list(lines)for i in range(len(dataset):dataseti = float(x) for x in datasetireturn datasetdef splitDataset(dataset, splitRa

13、tio):trainSize = int(len(dataset) * splitRatio)trainSet = copy = list(dataset)while len(trainSet) bestProb:bestProb = probabilitybestLabel = classValuereturn bestLabeldef getPredictions(summaries, testSet):predictions = for i in range(len(testSet):result = predict(summaries, testSeti)787980818283848

14、58687888990919293949596979899100101predictions.append(result)return predictionsdef getAccuracy(testSet, predictions):correct = 0for i in range(len(testSet):if testSeti-1 = predictionsi:correct += 1return (correct/float(len(testSet) * 100.0def main():filename = pima-indians-diabetes.data.csvsplitRati

15、o = 0.67dataset = 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 modelsummaries = summarizeByClass(trainingSet)# test modelpredictions = getPredictions(summaries, t

16、estSet)accuracy = getAccuracy(testSet, predictions)print(Accuracy: 0%).format(accuracy)main()运行示例,得到如下输出:Python12Split 768 rows into train=514 and test=254 rowsAccuracy: 76.3779527559%实现扩展这一部分为你提供了扩展思路,你可以将其作为教程的一部分,使用你已经实现的Python 代码,进行应用研究。到此,你已经使用 Python 一步步完成了高斯版本的朴素贝叶斯。你可以进一步扩展算法实现:计算所属类的概率:将一个数

17、据样本归属于每个类的概率更新为一个比率。计算上就是将一个样本数据归属于某个类的概率,比上其归属于每一个类的概率的和。举例来说,一个样本属于类 A 的概率时 0.02,属于类 B 的概率时 0.001,那么样本属于类 A 的可能性是 (0.02/(0.02+0.001)*100 大约为 95.23%。对数概率:对于一个给定的属性值,每个类的条件概率很小。当将其相乘时结果会更小,那么存在浮点溢出的可能(数值太小,以至于在 Python 中不能表示)。一个常用的修复方案是,合并其概率的对数值。可以研究实现下这个改进。名词属性:改进算法实现,使其支持名词属性。这是十分相似的,你所收集的每个属性的摘要信

18、息是对于每个类的类别值的比率。潜心学习参考文献来获取更多信息。不同的密度函数(伯努利或者多项式):我们已经尝试了高斯朴素贝叶斯,你也可以尝试下其他分布。实现一个不同的分布诸如多项分布、伯努利分布或者内核朴素贝叶斯,他们对于属性值的分布 和/或 与类值之间的关系有不同的假设。学习资源及深入阅读这一部分提供了一些用于学习更多朴素贝叶斯算法的资源,包括算法理论和工作原理,以及代码实现中的实际问题。问题更多学习预测糖尿病发作问题的资源 Pima Indians Diabetes Data Set:这个页面提供数据集文件,同时描述了各个属性,也列出了使用该数据集的论文列表 Dataset File:数据

19、集文件 Dataset Summary:数据集属性的描述 Diabetes Dataset Results:许多标准算法在该数据集上的精度代码这一部分包含流行的机器学习库中的朴素贝叶斯的开源实现。如果你在考虑实现自己的用于实际使用的版本,可以查阅这些 Naive Bayes in Scikit-Learn:scikit-learn 库中朴素贝叶斯的实现 Naive Bayes documentation:scikit-learn 库中关于朴素贝叶斯的文档和样例代码 Simple Naive Bayes in Weka:朴素贝叶斯的 Weka 实现书籍你应该有几本机器学习应用的书籍。这一部分高亮

20、出了常用机器学习书籍中关于朴素贝叶斯的章节。 Applied Predictive Modeling, page 353 Data Mining: Practical Machine Learning Tools and Techniques, page 94 Machine Learning for Hackers, page 78 An Introduction to Statistical Learning: with Applications in R, page 138 Machine Learning: An Algorithmic Perspective, page 171 Machine Learning in Action, page 61 (Chapter 4) Machine Learning, page 177 (chapter 6)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Python

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报