使用 Python 轻松实现机器学习

使用朴素贝叶斯分类器解决现实世界中的机器学习问题。
127 位读者喜欢这篇文章。
arrows cycle symbol for failing faster

Opensource.com

朴素贝叶斯是一种分类技术,是实现多种分类器建模算法的基础。基于朴素贝叶斯的分类器被认为是机器学习技术中最简单、最快、最容易使用的技术之一,但对于实际应用仍然有效。

朴素贝叶斯基于 贝叶斯定理,由 18 世纪统计学家 托马斯·贝叶斯提出。该定理评估事件发生的概率,基于与该事件相关的条件。 例如,患有 帕金森病的个体通常具有语音变化;因此,这些症状被认为与帕金森诊断的预测有关。 最初的贝叶斯定理提供了一种确定目标事件概率的方法,而朴素变体扩展并简化了该方法。

解决现实世界的问题

本文演示了朴素贝叶斯分类器解决现实世界问题的能力(而不是完整的商业级应用程序)。 我假设您对机器学习 (ML) 有基本的了解,因此一些主要与 ML 预测无关的步骤,例如数据洗牌和拆分,在此不做介绍。如果您是 ML 初学者或需要复习,请参阅今天机器学习简介开源机器学习入门

朴素贝叶斯分类器是 监督的生成式的,非线性的,参数化的,和 概率的

在本文中,我将通过预测帕金森氏症诊断的示例来演示使用朴素贝叶斯。此示例的数据集来自此 UCI 机器学习存储库。 此数据包括几种语音信号变化,用于评估患病可能性;此示例将使用其中的前八个。

  • MDVP:Fo(Hz): 平均声乐基频
  • MDVP:Fhi(Hz): 最大声乐基频
  • MDVP:Flo(Hz): 最小声乐基频
  • MDVP:Jitter(%)MDVP:Jitter(Abs)MDVP:RAPMDVP:PPQJitter:DDP: 五种基频变化指标

本例中使用的数据集,经过洗牌和拆分以供使用,可在我的 GitHub 存储库中找到。

使用 Python 进行 ML

我将使用 Python 来实现解决方案。我用于此应用程序的软件是

  • Python 3.8.2
  • Pandas 1.1.1
  • scikit-learn 0.22.2.post1

Python 中有几种开源朴素贝叶斯分类器实现,包括

  • NLTK 朴素贝叶斯:基于用于文本分类的标准朴素贝叶斯算法
  • NLTK 正朴素贝叶斯: NLTK 朴素贝叶斯的一种变体,可使用部分标记的训练集执行二元分类
  • Scikit-learn 高斯朴素贝叶斯:提供部分拟合以支持数据流或非常大的数据集
  • Scikit-learn 多项式朴素贝叶斯:针对离散数据特征、示例计数或频率进行了优化
  • Scikit-learn 伯努利朴素贝叶斯:专为二进制/布尔特征设计

本例中,我将使用 sklearn Gaussian Naive Bayes

这是我的 Python 实现 naive_bayes_parkinsons.py

import pandas as pd

# Feature columns we use
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']

# Train

# Read train data
train_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)

# Load sklearn Gaussian Naive Bayes and fit
from sklearn.naive_bayes import GaussianNB 

gnb = GaussianNB() 
gnb.fit(train_x, train_y) 

# Prediction on train data
predict_train = gnb.predict(train_x)
print('Prediction on train data:', predict_train) 

# Accuray score on train data
from sklearn.metrics import accuracy_score
accuracy_train = accuracy_score(train_y, predict_train)
print('Accuray score on train data:', accuracy_train)

# Test

# Read test data
test_data = pd.read_csv('parkinsons/Data_Parkinsons_TEST.csv')
test_x = test_data[x_rows]
test_y = test_data[y_rows]

# Prediction on test data
predict_test = gnb.predict(test_x)
print('Prediction on test data:', predict_test) 

# Accuracy Score on test data
accuracy_test = accuracy_score(test_y, predict_test)
print('Accuray score on test data:', accuracy_train)

运行 Python 应用程序

$ python naive_bayes_parkinsons.py

train_x:
      MDVP:Fo(Hz)  MDVP:Fhi(Hz) ...  MDVP:RAP  MDVP:PPQ  Jitter:DDP
0        152.125       161.469  ...   0.00191   0.00226     0.00574
1        120.080       139.710  ...   0.00180   0.00220     0.00540
2        122.400       148.650  ...   0.00465   0.00696     0.01394
3        237.323       243.709  ...   0.00173   0.00159     0.00519
..           ...           ...           ...  ...       ...       ...         
155      138.190       203.522  ...   0.00406   0.00398     0.01218

[156 rows x 8 columns]

train_y:
      status
0         1
1         1
2         1
3         0
..      ...
155       1

[156 rows x 1 columns]

Prediction on train data: [1 1 1 0 ... 1]
Accuracy score on train data: 0.6666666666666666

Prediction on test data: [1 1 1 1 ... 1
 1 1]
Accuracy score on test data: 0.6666666666666666

在此示例中,训练集和测试集的准确率得分均为 67%;其性能可以优化。 您想尝试一下吗? 如果是,请在下面的评论中分享您的方法。

底层原理

朴素贝叶斯分类器基于贝叶斯规则或定理,该定理计算条件概率,或者当另一个相关事件发生时,事件发生的可能性。 简单来说,它回答了这个问题:如果我们知道事件 x 在事件 y 之前发生的概率,那么当 x 再次发生时,y 发生的概率是多少? 该规则使用先验预测值,该预测值会逐渐细化以得出最终的后验值。 贝叶斯的一个基本假设是所有参数都具有同等重要性。

从高层次上讲,贝叶斯计算中涉及的步骤是

  1. 计算总体后验概率(“患有帕金森病”和“未患帕金森病”)
  2. 计算所有值和事件的每个可能值的后验概率
  3. 通过将 #1 和 #2 的结果相乘,计算所需事件的最终后验概率

步骤 2 在计算上可能非常繁琐。 朴素贝叶斯简化了它

  1. 计算总体后验概率(“患有帕金森病”和“未患帕金森病”)
  2. 计算所需事件值的后验概率
  3. 通过将 #1 和 #2 的结果相乘,计算所需事件的最终后验概率

这是一个非常基本的解释,并且必须考虑其他几个因素,例如数据类型、稀疏数据、丢失数据等等。

超参数

朴素贝叶斯是一种简单直接的算法,不需要超参数。 但是,特定的实现可能会提供高级功能。 例如,GaussianNB 有两个

  • priors:可以指定先验概率,而不是算法从数据中获取先验概率。
  • var_smoothing:这提供了考虑数据曲线变化的能力,这在数据不遵循典型高斯分布时很有用。

损失函数

秉承其简单性理念,朴素贝叶斯使用 0-1 损失函数。 如果预测正确匹配预期结果,则损失为 0,否则为 1。

优点和缺点

优点:朴素贝叶斯是最简单、最快的算法之一。

优点:即使数据较少,朴素贝叶斯也能给出合理的预测。

缺点:朴素贝叶斯预测是估计值,不是精确值。 它偏爱速度而不是准确性。

缺点:朴素贝叶斯的一个基本假设是所有特征的独立性,但情况并非总是如此。

本质上,朴素贝叶斯是贝叶斯定理的扩展。 它是最简单、最快的机器学习算法之一,旨在实现简单快速的训练和预测。 朴素贝叶斯提供了足够好、相当准确的预测。 其基本假设之一是预测特征的独立性。 几种开源实现提供了优于贝叶斯算法的特性。

接下来阅读
User profile image.
Girish 在印度一家全球 IT 服务组织拥有超过 20 年的技术和软件经验。 Girish 是“I Got”云平台的架构师,该平台旨在利用开源堆栈和现代架构模式(如微服务、容器化和多租户)来提升金字塔底部。 Girish 撰写有关开源和技术主题的文章。

3 条评论

我完全同意您的观点,即 Python 是机器学习的最佳编程语言。

在被诊断出患有帕金森病后,我的初级保健医生向我介绍了 Mayaka Natural Clinic 及其 PD 公式方案,这种草药治疗对我的病情产生了巨大的影响。经过治疗计划后,我的症状,包括麻木和肌肉无力,全部消失了!他们的网站是 w w w. mayakanaturalclinic. c o m

请阅读

Worldherbsclinic 帕金森病草药配方帮助了我亲爱的丈夫。我为他感到难过,因为这是一种艰难的疾病,他尝试又尝试,感到非常沮丧。大约两个多月的时间,他一直在服用这种产品,而且效果很好。我也看到了它的发生。他更快乐了,现在可以自己扣衬衫了。我的丈夫是个好人,我们已经结婚五十一年了。这种疾病会慢慢地夺走一个人,而且很痛苦。但现在我亲爱的丈夫又更像他自己了。他更活跃,也更有智慧。我认为他更活泼了,但我认为这一切都是好的,因为之前他真的停止说话了。现在我们可以再次交谈了,我很想念他。感谢 Worldherbsclinic 提供的这款产品。我们在这个世界上剩下的时间不多了,您给了我们更多的时间在一起。再次感谢。我希望这篇评论对所有 PD 患者都有用,并且我做对了。我不擅长使用电脑。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.