1. 算法原理
1.1 朴素贝叶斯算法原理
朴素贝叶斯算法(Naive Bayes) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。朴素贝叶斯算法假设所有特征的出现相互独立互不影响,每一特征同等重要,又因为其简单,而且具有很好的可解释性一般。相对于其他精心设计的更复杂的分类算法,朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。朴素贝叶斯算法一般应用在文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等。
算法具体步骤如下:
① 在样本集中,得到每个特征的条件概率。当涉及到多个条件时,朴素贝叶斯有一个提前的假设,我们称之为 条件独立性假设(或者 简单假设:Naive):公式为
。这个公式是朴素贝叶斯的基础假设,即各个条件概率是相互独立的,A不影响B,B不影响A。而对这里来说,假设
,则
② 在样本集中,计算每个类别的先验概率。
③ 在测试集中,计算后验概率。。选择后验概率最大的
作为
的类别,所以为方便比较,去掉分母,得到
。
1.2 算法改进
朴素贝叶斯是基于属性之间的独立性假设而进行构建的,但是实际上很多时候这种假设存在一定的局限,改进方法如下(在之后会详述):
-
半朴素贝叶斯 ODE(One Dependent Estimator):为了解决朴素贝叶斯中属性独立性假设在实际生活中不太适用的问题,新的研究方案尝试建立一些属性间的联系,假定属性有一定的相关性,从而产生的算法被称为半朴素贝叶斯方法。这里说的 ODE 就是其中的一种,在 ODE 中,假设每个属性最多依赖于一个其他的属性,这样修正了一些有依赖的情况,同时又没有增加太多的计算复杂性。
-
AODE(Averaged One Dependent Estimator):AODE 其实是一种集成学习的方法。在 ODE 的基础上,使用 bagging 集成学习的思路,训练多个模型,其中每个模型都设置一种属性作为其他所有属性的关联属性,最后使用这多个模型的结果平均数值作为最终结果。
2. 简单实践
2.1 利用sklearn中自带的鸢尾花数据
import numpy as np
# 加载莺尾花数据集
from sklearn import datasets
# 导入高斯朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
# 导入数据
X, y = datasets.load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 使用高斯朴素贝叶斯进行计算
clf = GaussianNB() # 特征是数值类型,假设数值服从正态分布,使用高斯朴素贝叶斯
clf.fit(X_train, y_train)
# 评估
y_pred = clf.predict(X_test)
acc = np.sum(y_test == y_pred) / X_test.shape[0]
print("Test Acc : %.3f" % acc)
# 预测
y_proba = clf.predict_proba(X_test[:1])
print(clf.predict(X_test[:1]))
print("预计的概率值:", y_proba)