朴素贝叶斯是一种分类技术,是实现多种分类器建模算法的基础。基于朴素贝叶斯的分类器被认为是机器学习技术中最简单、最快、最容易使用的技术之一,但对于实际应用仍然有效。
朴素贝叶斯基于 贝叶斯定理,由 18 世纪统计学家 托马斯·贝叶斯提出。该定理评估事件发生的概率,基于与该事件相关的条件。 例如,患有 帕金森病的个体通常具有语音变化;因此,这些症状被认为与帕金森诊断的预测有关。 最初的贝叶斯定理提供了一种确定目标事件概率的方法,而朴素变体扩展并简化了该方法。
解决现实世界的问题
本文演示了朴素贝叶斯分类器解决现实世界问题的能力(而不是完整的商业级应用程序)。 我假设您对机器学习 (ML) 有基本的了解,因此一些主要与 ML 预测无关的步骤,例如数据洗牌和拆分,在此不做介绍。如果您是 ML 初学者或需要复习,请参阅今天机器学习简介和开源机器学习入门。
朴素贝叶斯分类器是 监督的,生成式的,非线性的,参数化的,和 概率的。
在本文中,我将通过预测帕金森氏症诊断的示例来演示使用朴素贝叶斯。此示例的数据集来自此 UCI 机器学习存储库。 此数据包括几种语音信号变化,用于评估患病可能性;此示例将使用其中的前八个。
- MDVP:Fo(Hz): 平均声乐基频
- MDVP:Fhi(Hz): 最大声乐基频
- MDVP:Flo(Hz): 最小声乐基频
- MDVP:Jitter(%)、MDVP:Jitter(Abs)、MDVP:RAP、MDVP:PPQ 和 Jitter: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 的结果相乘,计算所需事件的最终后验概率
步骤 2 在计算上可能非常繁琐。 朴素贝叶斯简化了它
- 计算总体后验概率(“患有帕金森病”和“未患帕金森病”)
- 计算所需事件值的后验概率
- 通过将 #1 和 #2 的结果相乘,计算所需事件的最终后验概率
这是一个非常基本的解释,并且必须考虑其他几个因素,例如数据类型、稀疏数据、丢失数据等等。
超参数
朴素贝叶斯是一种简单直接的算法,不需要超参数。 但是,特定的实现可能会提供高级功能。 例如,GaussianNB 有两个
- priors:可以指定先验概率,而不是算法从数据中获取先验概率。
- var_smoothing:这提供了考虑数据曲线变化的能力,这在数据不遵循典型高斯分布时很有用。
损失函数
秉承其简单性理念,朴素贝叶斯使用 0-1 损失函数。 如果预测正确匹配预期结果,则损失为 0,否则为 1。
优点和缺点
优点:朴素贝叶斯是最简单、最快的算法之一。
优点:即使数据较少,朴素贝叶斯也能给出合理的预测。
缺点:朴素贝叶斯预测是估计值,不是精确值。 它偏爱速度而不是准确性。
缺点:朴素贝叶斯的一个基本假设是所有特征的独立性,但情况并非总是如此。
本质上,朴素贝叶斯是贝叶斯定理的扩展。 它是最简单、最快的机器学习算法之一,旨在实现简单快速的训练和预测。 朴素贝叶斯提供了足够好、相当准确的预测。 其基本假设之一是预测特征的独立性。 几种开源实现提供了优于贝叶斯算法的特性。
3 条评论