朴素贝叶斯
在本节课中,我们介绍朴素贝叶斯算法,并演示如何将其用于分类任务。
在机器学习中,朴素贝叶斯(Naive Bayes) 分类器是一类简单的“概率分类器”,其基于贝叶斯定理,并对特征之间做出强独立性假设。
在开始编码之前,我们先了解一些关于贝叶斯定理的理论知识。
贝叶斯定理
在深入讨论该分类器并尝试实现代码前,我们需要先理解贝叶斯定理的基本概念。
贝叶斯定理(也称为贝叶斯法则或贝叶斯公式)描述了在已知与事件相关的某些先验条件下,该事件发生的概率。
例如,历史数据显示,每个人患疾病A的概率为10%,即 。在某医院的患者中,出现症状B的概率为 。同时,患有疾病A的患者中出现症状B的概率是0.1,即 。那么当你出现了症状B时,你患疾病A的概率是多少?使用下面的公式可以计算出结果:。
另一个简单且实际的例子是电子邮件垃圾邮件过滤器。早期许多邮件服务提供商使用贝叶斯方法来过滤垃圾邮件,具体步骤如下:
- 第一步:计算语料库(全部邮件归档)中每个词出现的概率。
- 第二步:计算垃圾邮件所占的比例。
- 第三步:计算每个词在垃圾邮件中出现的概率。
“朴素”(naive)是什么意思?
“朴素”意味着模型中的各个特征彼此相互独立。这一假设在现实中并不成立,因为特征之间或多或少存在依赖关系。然而,这种假设极大地简化了模型结构,并且在某些情况下对模型效果影响较小。
与其他模型的比较
相比其他模型,贝叶斯方法具有一些优势:
- 训练和测试速度都非常快。
- 没有超参数需要调优。
- 实现简单,易于理解和解释。
理论部分到此结束,接下来我们进行代码实现。
使用 GaussianNB 方法建模
sklearn 提供了一组基于贝叶斯定理的监督学习算法,它们的主要区别在于对标签分布先验的假设不同,例如高斯分布或伯努利分布。
GaussianNB 实现了用于分类的高斯朴素贝叶斯算法,假设特征的似然服从高斯分布:
其中参数 和 通过最大似然估计得到。
在以下示例中,我们将使用 GaussianNB 来展示如何应用贝叶斯方法。数据加载和划分部分将不再单独说明,完整代码如下所示。创建一个朴素贝叶斯对象非常简单,只需调用 GaussianNB 并进行 fit 拟合即可。
1from sklearn.naive_bayes import GaussianNB 2 3gnb = GaussianNB() 4gnb.fit(train_x, train_y)
以下是完整的代码,你可以直接运行尝试:
1import sklearn.datasets as datasets 2from sklearn.model_selection import train_test_split 3from sklearn.naive_bayes import GaussianNB 4import sklearn.metrics as metrics 5 6X, y = datasets.load_breast_cancer(return_X_y=True) 7print("breast cancer data size is {}".format(X.shape)) 8print("breast cancer target size is {}".format(y.shape)) 9print("The first five samples of breast cancer {}".format(X[:5])) 10 11train_x, test_x, train_y, test_y = train_test_split(X, 12 y, 13 test_size=0.2, 14 random_state=42) 15 16gnb = GaussianNB() 17gnb.fit(train_x, train_y) 18 19pred_y = gnb.predict(test_x) 20print("The first five prediction {}".format(pred_y[:5])) 21print("The real first five labels {}".format(test_y[:5])) 22print("The confusion matrix is: ") 23cm = metrics.confusion_matrix(test_y, pred_y) 24print(cm)
- 首先,在第6行通过
load_breast_cancer加载了“乳腺癌”数据集,并将其划分为训练集和测试集。 - 在第16行,使用
GaussianNB()创建了一个朴素贝叶斯对象。其中NB表示朴素贝叶斯,Gaussian表示对数据分布的高斯假设。 - 本例中,在第23行使用
confusion_matrix来评估模型性能。