引言
朴素贝叶斯(Naive Bayes)算法是机器学习中常见的基本算法之一,它主要被用来做分类任务。其理论基础是基于贝叶斯定理和条件独立性假设的一种分类方法。对于给定的训练数据集:
基于以上的解释,我们知道:(1)该算法的理论核心是贝叶斯定理;(2)它是基于条件独立性假设这个强假设基础之上的,这也是它为什么被称为“朴素”的主要原因。
本文将从以下的角度讲解朴素贝叶斯算法:
- Naive Bayes 的数学原理;
- Naive Bayes 的参数估计;
- 贝叶斯估计;
- Naive Bayes 实战。
Naive Bayes 算法的数学原理
由于该算法的基本思想是基于朴素贝叶斯定理的,所以本节首先介绍一下朴素贝叶斯算法背后的数学原理。
贝叶斯定理
后验概率最大化的意义
由上述的推导可知,朴素贝叶斯分类是将实例分到后验概率最大的类中。这等价于期望风险最小化。这就是朴素贝叶斯法所采用的原理。
Naive Bayes 算法的参数估计
特征值为离散型变量时的参数估计
特征值为连续型变量时的参数估计
贝叶斯估计
Naive Bayes 算法实战
在 scikit-learn 中,GaussianNB 实现了基于高斯贝叶斯算法的分类器。此时特征值为连续型变量,并且假设其服从高斯分布。
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn import datasets
# 加载iris数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
print('Sample num: ', len(y))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
clf = GaussianNB()
# 训练模型
clf.fit(X_train, y_train)
# 预测结果
ans = clf.predict(X_test)
# 计算准确率
cnt = 0
for i in range(len(y_test)):
if ans[i] - y_test[i] < 1e-1:
cnt += 1
# print(ans[i], ' ', y_test[i])
print("Accuracy: ", (cnt * 100.0 / len(y_test)), "%")
运行结果
Sample num: 150
Accuracy: 97.77777777777777 %