BayesianClassifierfromScratchinPythonforMachineLearning朴素贝叶斯算法简单高效,应该是处理分类问题时首先要考虑的方法之一。通过本教程,您将学习朴素贝叶斯算法的原理和Python版的一步步实现。更新:查看后续文章《BetterNaiveBayes:12TipsToGettheMostFromTheNaiveBayesAlgorithm》朴素贝叶斯分类器,MattBuck保留部分版权关于朴素贝叶斯朴素贝叶斯Yeesian算法是一种直观的方法,它使用每个属性属于某一类的概率来进行预测。您可以使用这种监督学习方法对预测建模问题进行概率建模。给定一个类,朴素贝叶斯通过假设属于该类的每个属性的概率独立于所有其余属性来简化概率的计算。这种强有力的假设产生了一种快速、有效的方法。给定一个属性值,它属于某一类的概率称为条件概率。对于给定的类值,将每个属性的条件概率相乘,得到数据样本属于某一类的概率。我们可以通过计算样本属于每个类别的概率,然后选择概率最高的类别来进行预测。通常,我们使用分类数据来描述朴素贝叶斯,因为它很容易通过比率来描述和计算。对我们的目的有用的算法需要支持数值属性,同时假设每个数值属性服从正态分布(分布在钟形曲线上),这又是一个强有力的假设,但仍然给出了稳健的结果。预测糖尿病的发病本文所用的试题是“皮马印第安人糖尿病问题”。该问题包括对Pima印第安人患者进行的768次医学观察的详细信息,记录描述了患者的年龄、怀孕和验血次数等即时测量结果。所有患者均为21岁以上(含21岁)的女性,所有属性均为数值,属性单位不同。每条记录属于一个类别,表明患者在测量时5年内是否感染了糖尿病。如果是,则为1,否则为0。该标准数据集已在机器学习文献中多次研究,具有70%-76%的良好预测精度。下面是pima-indians.data.csv文件中的示例,以了解我们将使用的数据。注意:下载文件并使用.csv扩展名保存(例如:pima-indians-diabetes.data.csv)。查看文件中所有属性的描述。6,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朴素贝叶斯算法教程教程分为以下几个步骤:1.数据处理:从CSV文件加载数据,然后分为训练集和测试集。2.提取数据特征:提取训练数据集的属性特征,以便我们计算概率并进行预测。3.单一预测:利用数据集的特征生成单一预测。4.多重预测:根据给定的测试数据集和具有提取特征的训练数据集生成预测。5.评估准确率:评估对测试数据集的预测准确率作为预测准确率。6.组合代码:展示了一个完整的、独立的朴素贝叶斯算法实现,包含所有代码。1.处理数据首先加载数据文件。CSV格式的数据没有标题行和引号。我们可以使用csv模块中的open函数打开文件,使用reader函数读取行数据。我们还需要将作为字符串加载的属性转换为我们可以使用的数字。下面是用于加载PimaIndians数据集的loadCsv()函数。importcsvdefloadCsv(文件名):lines=csv.reader(open(filename,"rb"))dataset=list(lines)foriinrange(len(dataset)):dataset[i]=[float(x)forxindataset[i]]returndataset我们可以通过加载PimaIndian数据集并打印出数据中的样本数来测试此功能。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()函数,它将数据集按照给定的分割比例进行分割。importrandomdefsplitDataset(数据集,splitRatio):trainSize=int(len(dataset)*splitRatio)trainSet=[]copy=list(dataset)whilelen(trainSet)bestProb:bestProb=probabilitybestLabel=classValuereturnbestLabel测试预测()函数=如下:A':[(1,0.5)],'B':[(20,5.0)]}inputVector=[1.1,'?']result=predict(summaries,inputVector)print('预测:{0}').format(result)运行测试,你会得到如下结果:Prediction:Amultipleprediction最后,我们可以通过预测测试数据集中的每个数据样本来评估模型的准确性。getPredictions()函数执行此操作并返回每个测试样本的预测列表。defgetPredictions(summaries,testSet):predictions=[]foriinrange(len(testSet)):result=predict(summaries,testSet[i])predictions.append(result)returnpredictionstestgetPredictions()函数如下。摘要={'A':[(1,0.5)],'B':[(20,5.0)]}testSet=[[1.1,'?'],[19.1,'?']]predictions=getPredictions(summaries,testSet)print('Predictions:{0}').format(predictions)运行测试,你会看到如下结果:Predictions:['A','B']计算预测值的准确度和对测试数据集中的类别值进行比较,可以计算出0%到100%之间的准确率作为分类准确率。getAccuracy()函数可以计算出这个准确率。defgetAccuracy(testSet,predictions):correct=0forxinrange(len(testSet)):iftestSet[x][-1]==predictions[x]:correct+=1return(correct/float(len(testSet)))*100.0我们可以使用下面的简单代码来测试getAccuracy()函数。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)运行测试,你会得到如下结果:Accuracy:66.6666666667合并代码最后,我们需要连接代码。下面是Python版本的朴素贝叶斯的分步实现的完整代码。运行示例,得到如下输出:Split768rowsintotrain=514andtest=254rowsAccuracy:76.3779527559%实现扩展这部分为您提供扩展思路,您可以将其作为教程的一部分,使用您实现的Python代码进行应用研究。至此,你已经使用Python一步步完成了朴素贝叶斯的高斯版本。您可以进一步扩展算法实现:计算属于一个类的概率:将数据样本属于每个类的概率更新为比率。在计算上,它是将样本数据分配给某个类别的概率,与分配给每个类别的概率之和相比。比如一个样本属于A类的概率是0.02,属于B类的概率是0.001,那么样本属于A类的概率就是(0.02/(0.02+0.001))*100,约为95.23%。LogProbability:对于给定的属性值,每个类的条件概率很小。与它相乘时结果会变小,然后有可能浮点溢出(数字太小而无法用Python表示)。一个常见的修复方法是合并它们概率的对数值。这种改进是可以研究和实施的。名词属性:改进算法实现以支持名词属性。这很相似,你为每个属性收集的汇总信息是每个类别的类别值的比率。深入参考以获取更多信息。不同的密度函数(伯努利或多项式):我们已经尝试过高斯朴素贝叶斯,你也可以尝试其他分布。实现不同的分布,例如多项分布、伯努利分布或核朴素贝叶斯分布,它们对属性值的分布和/或类值之间的关系做出不同的假设。学习资源和延伸阅读本节提供了一些资源,用于进一步了解朴素贝叶斯算法,包括算法理论和工作原理,以及代码实现中的实际问题。QuestionsMoreresourcesforlearningtopredicatetheonsetofdiabetesPimaIndiansDiabetesDataSet:本页提供了数据集文件,描述了每个属性,还列出了使用该数据集的论文DatasetFile:DatasetFileDatasetSummary:DataDescriptionofsetproperties糖尿病数据集结果:该数据集上许多标准算法的准确性这部分代码包含流行机器学习库中朴素贝叶斯的开源实现。如果您正在考虑为实际使用实现自己的版本,请查看Scikit-Learn中的这些朴素贝叶斯:朴素贝叶斯文档:scikit-learn中的朴素贝叶斯文档和示例代码Weka中的简单朴素贝叶斯:朴素贝叶斯书籍的Weka实现你应该有几本关于机器学习应用程序的书。本节重点介绍流行的机器学习书籍中有关朴素贝叶斯的章节。应用预测建模,第353页数据挖掘:实用机器学习工具和技术,第94页黑客机器学习,第78页统计学习简介:R中的应用,第138页机器学习:算法视角,第171页机器学习在行动,第61页(第4章)机器学习,第177页(第6章)