用朴素贝叶斯分类器解决现实世界里的轻器学机器学习问题。 朴素贝叶斯Naïve Bayes是松实一种分类技术,它是现机习许多分类器建模算法的基础。基于朴素贝叶斯的轻器学分类器是简单、快速和易用的松实机器学习技术之一,而且在现实世界的现机习应用中很有效。 朴素贝叶斯是轻器学从 贝叶斯定理Bayes theorem 发展来的。贝叶斯定理由 18 世纪的松实统计学家 托马斯·贝叶斯 提出,它根据与一个事件相关联的现机习其他条件来计算该事件发生的概率。比如,轻器学帕金森氏病 患者通常嗓音会发生变化,松实因此嗓音变化就是现机习与预测帕金森氏病相关联的症状。贝叶斯定理提供了计算目标事件发生概率的轻器学方法,而朴素贝叶斯是松实对该方法的推广和简化。 这篇文章展示了朴素贝叶斯分类器解决现实世界问题(相对于完整的亿华云计算商业级应用)的能力。我会假设你对机器学习有基本的了解,所以文章里会跳过一些与机器学习预测不大相关的步骤,比如 数据打乱date shuffling 和 数据切片data splitting。如果你是机器学习方面的新手或者需要一个进修课程,请查看 《An introduction to machine learning today》 和 《Getting started with open source machine learning》。 朴素贝叶斯分类器是 有监督的supervised、属于 生成模型generative 的、非线性的、属于 参数模型parametric 的和 基于概率的probabilistic。 在这篇文章里,我会演示如何用朴素贝叶斯预测帕金森氏病。需要用到的数据集来自 UCI 机器学习库。这个数据集包含许多语音信号的指标,用于计算患帕金森氏病的可能性;在这个例子里我们将使用这些指标中的前 8 个: 这个例子里用到的数据集,可以在我的 GitHub 仓库 里找到。数据集已经事先做了打乱和切片。 接下来我会用 Python 来解决这个问题。我用的软件是: Python 有多个朴素贝叶斯分类器的实现,都是开源的,包括: 在这个例子里我将使用 sklearn Gaussian Naive Bayes。 我的 Python 实现在 naive_bayes_parkinsons.py 里,如下所示: 运行这个 Python 脚本: 在训练集和测试集上的准确率都是 67%。它的性能还可以进一步优化。你想尝试一下吗?你可以在下面的评论区给出你的方法。 朴素贝叶斯分类器从贝叶斯定理发展来的。贝叶斯定理用于计算条件概率,或者说贝叶斯定理用于计算当与一个事件相关联的其他事件发生时,该事件发生的概率。简而言之,它解决了这个问题:如果我们已经知道事件 x 发生在事件 y 之前的概率,那么当事件 x 再次发生时,事件 y 发生的概率是多少? 贝叶斯定理用一个先验的预测值来逐渐逼近一个最终的 后验概率。贝叶斯定理有一个基本假设,就是所有的参数重要性相同(LCTT 译注:即相互独立)。 贝叶斯计算主要包括以下步骤: 计算总的先验概率: P(患病)P(患病) 和 P(不患病)P(不患病) 计算 8 种指标各自是某个值时的后验概率 (value1,...,value8 分别是 MDVP:Fo(Hz),...,Jitter:DDP 的取值): P(value1,\ldots,value8\ |\ 患病)P(value1,…,value8 ∣ 患病) P(value1,\ldots,value8\ |\ 不患病)P(value1,…,value8 ∣ 不患病) 将第 1 步和第 2 步的结果相乘,最终得到患病和不患病的后验概率: P(患病\ |\ value1,\ldots,value8) \propto P(患病) \times P(value1,\ldots,value8\ |\ 患病)P(患病 ∣ value1,…,value8)∝P(患病)×P(value1,…,value8 ∣ 患病) 上面第 2 步的计算非常复杂,朴素贝叶斯将它作了简化: 计算总的先验概率: P(患病)P(患病) 和 P(不患病)P(不患病) 对 8 种指标里的每个指标,计算其取某个值时的后验概率: P(value1\ |\ 患病),\ldots,P(value8\ |\ 患病)P(value1 ∣ 患病),…,P(value8 ∣ 患病) P(value1\ |\ 不患病),\ldots,P(value8\ |\ 不患病)P(value1 ∣ 不患病),…,P(value8 ∣ 不患病) 将第 1 步和第 2 步的结果相乘,最终得到患病和不患病的后验概率: P(患病\ |\ value1,\ldots,value8) \propto P(患病) \times P(value1\ |\ 患病) \times \ldots \times P(value8\ |\ 患病)P(患病 ∣ value1,…,value8)∝P(患病)×P(value1 ∣ 患病)×…×P(value8 ∣ 患病) 这只是一个很初步的解释,还有很多其他因素需要考虑,比如数据类型的差异,稀疏数据,数据可能有缺失值等。 朴素贝叶斯作为一个简单直接的算法,不需要超参数。然而,有的版本的朴素贝叶斯实现可能提供一些高级特性(比如超参数)。比如,GaussianNB 就有 2 个超参数: 为了坚持简单的原则,朴素贝叶斯使用 0-1 损失函数。如果预测结果与期望的输出相匹配,损失值为 0,否则为 1。 优点 :朴素贝叶斯是最简单、最快速的算法之一。 :在数据量较少时,用朴素贝叶斯仍可作出可靠的预测。 :朴素贝叶斯的预测只是估计值,并不准确。它胜在速度而不是准确度。 从本质上说,朴素贝叶斯是贝叶斯定理的推广。它是最简单最快速的机器学习算法之一,用来进行简单和快速的训练和预测。朴素贝叶斯提供了足够好、比较准确的预测。朴素贝叶斯假设预测特征之间是相互独立的。已经有许多朴素贝叶斯的开源的实现,它们的特性甚至超过了贝叶斯算法的实现。 解决一个现实世界里的现机习问题
用 Python 实现机器学习
背后原理
超参数
损失函数
优缺点