机器学习入门笔记04

朴素贝叶斯模型

系列文章

朴素贝叶斯模型

算法原理

贝叶斯分类源自如下所示的贝叶斯公式:

\\[ P(A|B) = \frac{P(B|A)P(A)}{P(B)} \\]

其中 \\( P(A) \\) 为事件 \\( A \\) 发生的概率,\\( P(A|B) \\) 为事件 \\( B \\) 发生的条件下事件 \\( A \\) 发生的概率。

如果计算出在满足 \\( X=1 \\) 中因变量 \\( Y=1 \\) 的情况明显集中,则可以说明该条件是分类为 1 的一个特征。

将贝叶斯模型推广至 \\( n \\) 个特征变量 \\( X_1, X_2, \dots, X_n \\) ,公式为:

\\[ P(Y|X_1, X_2, \dots, X_n) = \frac{P(Y|X_1, X_2, \dots, X_n | Y) \cdot P(Y)}{P(X_1, X_2, \dots, X_n)} \\]

朴素贝叶斯模型假设给定目标值之后各个特征变量间相互独立,分子的计算公式可以写成:

\\[ P(Y|X_1, X_2, \dots, X_n | Y) \cdot P(Y) = P(X_1 | Y) \cdot P(X_2 | Y) \dots P(X_n | Y) \cdot P(Y) \\]

根据等式右侧已知的数据,就可以计算在 \\( n \\) 个特征变量取不同值的情况下,目标变量取某个值的概率,并选择概率更高的情况对样本分类。

代码实现

首先导入并清洗数据:

with open('iris.csv', 'r') as file:
    data = pd.read_csv(file)
X = data.drop(columns='species')
Y = data['species'].map({'Iris-setosa': 1,
                         'Iris-versicolor': 2,
                         'Iris-virginica': 3})

通过如下代码引入朴素贝叶斯模型中的高斯贝叶斯分类器:

from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X_train, Y_train)
GaussianNB()

模型的搭建和评估方式都和前几个模型相差不大。简单对模型进行评价如下:

model.score(X_test, Y_test)
0.9736842105263158

可以看到模型预测的结果相当不错。除此之外,还可以使用 ROC 曲线等方式进行评价,与之前的模型一致。

朴素贝叶斯分类在应用过程中会把数据集特征看作相互独立的,而不需要考虑特征间的关联,因此运算速度较快,但是泛化能力稍弱。