当前位置: 首页 > 科技观察

使用Python轻松进行机器学习

时间:2023-03-19 01:54:48 科技观察

使用朴素贝叶斯分类器解决现实世界的机器学习问题。朴素贝叶斯是一种分类技术,是许多分类器建模算法的基础。基于朴素贝叶斯的分类器是一种简单、快速且易于使用的机器学习技术,在实际应用中非常有效。朴素贝叶斯是从贝叶斯定理发展而来的。贝叶斯定理由18世纪的统计学家托马斯·贝叶斯(ThomasBayes)制定,计算在给定与该事件相关的其他条件下该事件发生的概率。例如,患有帕金森病的人经常会出现变声,因此变声是与预测帕金森病相关的症状。贝叶斯定理提供了一种计算目标事件发生概率的方法,朴素贝叶斯是该方法的推广和简化。解决现实世界的问题这篇文章展示了朴素贝叶斯分类器解决现实世界问题的能力(与完整的商业级应用程序相对)。我会假设您对机器学习有基本的了解,因此本文将跳过一些与机器学习预测无关的步骤,例如日期改组和数据拆分。如果您是机器学习的新手或需要进修课程,请查看《An introduction to machine learning today》和《Getting started with open source machine learning》。朴素贝叶斯分类器是受监督的、生成的、非线性的、参数的和概率的。在这篇文章中,我将演示如何使用朴素贝叶斯来预测帕金森病。要使用的数据集来自UCI机器学习库。该数据集包含许多用于计算患帕金森病可能性的语音信号指标;在此示例中,我们将使用这些指标中的前8个:MDVP:Fo(Hz):平均声带基频MDVP:Fhi(Hz):最高声带基频MDVP:Flo(Hz):最低声带基频MDVP:Jitter(%)、MDVP:Jitter(Abs)、MDVP:RAP、MDVP:PPQ和Jitter:DDP:5个测得的声带基频变化指标本例中使用的数据集可以在我的GitHub存储库中找到。数据集事先已经过洗牌和切片。使用Python进行机器学习接下来我将在Python中解决这个问题。我用的软件是:Python3.8.2Pandas1.1.1scikit-learn0.22.2.post1Python有多个朴素贝叶斯分类器的实现,都是开源的,包括:NLTKNa?veBayes:Standard-basedNa?veBayesianalgorithm,fortextclassificationNLTKPositiveNa?veBayes:NLTKNa?veBayes的一个变种,用于只对训练集的一部分进行二元分类Scikit-learnGaussianNa?veBayes:提供一种偏拟合的方法来支持数据流或非常大的数据集(LCTT译注:Theymaynot一次加载到内存中,并且可以通过部分拟合动态增加数据)Scikit-learnMultinomialNa?veBayes:针对离散特征,实例计数,频率等进行了优化Scikit-learnBernoulliNa?veBayes:对于每个特征都是一个二元变量/布尔特征我将在这个例子中使用sklearn高斯朴素贝叶斯。我的Python实现在naive_bayes_parkinsons.py中,如下:importpandasaspd#x_rows是我们使用的8个特征的列名x_rows=['MDVP:Fo(Hz)','MDVP:Fhi(Hz)','MDVP:Flo(Hz)','MDVP:Jitter(%)','MDVP:Jitter(Abs)','MDVP:RAP','MDVP:PPQ','Jitter:DDP']y_rows=['status']#y_rows是类别的列名,如果有病,值为1,如果没有病,值为0#training#readtrainingdatatrain_data=pd.read_csv('parkinsons/Data_Parkinsons_TRAIN.csv')train_x=train_data[x_rows]train_y=train_data[y_rows]print("train_x:\n",train_x)print("train_y:\n",train_y)#importsklearnGaussianNaiveBayes,然后拟合训练数据fromsklearn.naive_bayesimportGaussianNBgnb=GaussianNB()gnb.fit(train_x,train_y)#预测训练数据predict_train=gnb.predict(train_x)print('Predictionontraindata:',predict_train)#来自sklearn.metrics的训练数据的准确性importaccuracy_scoreaccuracy_train=accuracy_score(train_y,predict_train)print('准确火车数据得分:',accuracy_train)#test#读取测试数据test_data=pd.read_csv('parkinsons/Data_Parkinsons_TEST.csv')test_x=test_data[x_rows]test_y=test_data[y_rows]#预测测试数据predict_test=gnb.predict(test_x)print('Predictionontestdata:',predict_test)#accuracyonthetestdataaccuracy_test=accuracy_score(test_y,predict_test)print('Accurayscoreontestdata:',accuracy_train)运行这个Python脚本:$pythonnaive_bayes_parkinsons.pytrain_x:MDVP:Fo(Hz)MDVP:Fhi(Hz)...MDVP:RAPMDVP:PPQJitter:DDP0152.125161.469。..0.001910.002260.005741120.080139.710...0.001800.002200.002200.005402122.400148.650...0.0046960.046960.01394323.709...status01112130.....1551[156行x1列]对列车数据的预测:[1110...1]训练数据的准确度得分:0.6666666666666666测试数据的预测:[1111...111]测试数据的准确度得分:0.6666666666666666在训练集和测试集上的准确率均为67%,性能还可以进一步优化。你想试试吗?你可以在下面的评论部分给出你的方法。朴素贝叶斯分类器背后的原理是从贝叶斯定理发展而来的。贝叶斯定理用于计算条件概率,或贝叶斯定理用于计算当与该事件相关联的其他事件发生时,该事件发生的概率。简而言之,它解决了一个问题:如果我们已经知道事件x在事件y之前发生的概率,那么当事件x再次发生时,事件y发生的概率是多少?贝叶斯定理使用先验预测器来渐近地逼近最终后验概率。贝叶斯定理的一个基本假设是所有参数都同等重要(LCTT译注:即相互独立)。贝叶斯计算主要包括以下步骤:计算总先验概率:P(disease)P(disease)和P(undisease)P(undisease)计算8种指标各自为一定值时的后验概率(value1,...,value8是MDVP的值:Fo(Hz),...,Jitter:DDP:P(value1,\ldots,value8\|\sick)P(value1,…,value8∠diseased)P(value1,\ldots,value8\|\notdisease)P(value1,…,value8|diseased)将第1步和第2步的结果相乘,最后得disease疾病和非疾病的后验概率:P(sickness\|\value1,\ldots,value8)\proptoP(sickness)\timesP(value1,\ldots,value8\|\sickness)P(sicknessDisease|value1,…,value8)∝P(illness)×P(value1,…,value8|illness)P(notsick\|\value1,\ldots,value8)\proptoP(notsick)\timesP(value1,\ldots,value8\|\notsick)P(notsick|value1,…,value8)∝P(notsick)×P(value1,…,value8|notsick)2步计算很复杂,朴素贝叶斯简化一下:计算总prior概率:P(affected)P(affected)和P(unaffected)P(unaffected)共8种对于指标中的每一个指标,计算取一定值时的后验概率:P(value1\|\sick),\ldots,P(value8\|\sick)P(value1|ill),…,P(value8|disease)P(value1\|\notsick),\ldots,P(value8\|\notsick)P(value1|notsick),...,P(value8|notsick)将第1步和第2步的结果相乘,最终得到患病和未患病的后验概率:P(sick\|\value1,\ldots,值8)\proptoP(ill)\timesP(value1\|\ill)\times\ldots\timesP(value8\|\ill)P(ill|value1,...,value8)∝P(ill)×P(value1∠illness)×…×P(value8│illness)P(未受影响\|\value1,\ldots,value8)\proptoP(未生病)\timesP(value1\|\未受影响的疾病)\times\ldots\timesP(value8\|\notdisease)P(notdisease|value1,…,value8)∝P(notdisease)×P(value1|notdisease)×…×P(value8|notsick)这只是一个很初步的解释,还有很多其他因素需要考虑,比如数据类型的差异,数据稀疏,数据可能有缺失值等等。超参数朴素贝叶斯作为一种简单直接的算法,不需要超参数。但是,某些版本的朴素贝叶斯实现可能会提供一些高级功能(例如超参数)。比如GaussianNB有2个超参数:priors:先验概率,可以提前指定,这样算法就不用从数据中计算了。var_smoothing:考虑到数据的分布,当数据不符合标准高斯分布时,这个超参数就会起作用。损失函数为了坚持简单性原则,朴素贝叶斯使用0-1损失函数。如果预测与期望的输出匹配,则损失为0,否则为1。优点和缺点优点:朴素贝叶斯是最简单和最快的算法之一。优点:朴素贝叶斯在数据量较小的情况下仍然可以做出可靠的预测。缺点:朴素贝叶斯的预测只是估计,并不准确。它以速度而不是准确性取胜。缺点:朴素贝叶斯有一个基本假设,即所有的特征都是相互独立的,但现实中并不总是这样。本质上,朴素贝叶斯是贝叶斯定理的推广。它是最简单和最快的机器学习算法之一,可以轻松快速地进行训练和预测。朴素贝叶斯提供了足够好的、相对准确的预测。朴素贝叶斯假设预测特征是相互独立的。已经有很多朴素贝叶斯的开源实现,其特性甚至超过了贝叶斯算法的实现。