机器学习算法[3]--朴素贝叶斯原理详解及sklearn实现

1. 朴素贝叶斯

1.1 原理

朴素贝叶斯(Naive Bayes)是基于贝叶斯定理特征条件独立性假设的分类算法

贝叶斯定理定义如下:
P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) (1) P(Y|X) = \frac {P(X|Y)P(Y)}{P(X)} \tag{1} P(YX)=P(X)P(XY)P(Y)(1)
其中 P ( Y ∣ X ) P(Y|X) P(YX)为后验概率, P ( X ∣ Y ) P(X|Y) P(XY)为条件概率,即似然函数(概率), P ( Y ) P(Y) P(Y)为先验概率

根据条件独立性假设可知各个特征之间相互条件独立,因此式(1)可写为:
P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) = ∏ i = 1 n P ( x i ∣ Y ) P ( Y ) P ( X ) P(Y|X) = \frac {P(X|Y)P(Y)}{P(X)} = \prod_{i=1}^{n}P(x_i|Y) \frac {P(Y)}{P(X)} P(YX)=P(X)P(XY)P(Y)=i=1nP(xiY)P(X)P(Y)
其中 n n n为特征数目, x i x_i xi X X X i i i个特征上的取值, Y ∈ { c 0 , c 1 , . . . c k } Y\in \{ c_0, c_1,...c_k\} Y{ c0,c1,...ck} k k k为类别数量

由于在给定数据集下, P ( X ) P(X) P(X)对所有 P ( x i ∣ Y ) P(x_i|Y) P(xiY) P ( Y ) P(Y) P(Y)都是相同的, 所以 P ( Y ∣ X ) = ∏ i = 1 n P ( x i ∣ Y ) P ( Y ) P ( X ) ∝ ∏ i = 1 n P ( x i ∣ Y ) P ( Y ) P(Y|X) = \prod_{i=1}^{n}P(x_i|Y) \frac {P(Y)}{P(X)}∝\prod_{i=1}^{n}P(x_i|Y) {P(Y)} P(YX)=i=1nP(xiY)P(X)P(Y)i=1nP(xiY)P(Y)

朴素贝叶斯是一种概率生成模型,可用最大似然估计(MLE)或最大后验估计(MAP)对条件概率 P ( X ∣ Y ) P(X|Y) P(XY)和先验概率 P ( Y ) P(Y) P(Y)进行参数求解;然后基于求解模型,对给定数据求出最大的后验概率 P ( Y ∣ X ) P(Y|X) P(YX)即为最终输出类别

其中 P ( Y ) P(Y) P(Y)一般是输入数据中各类别的相对频率,而 P ( X ∣ Y ) P(X|Y) P(XY)可假设为高斯分布,多项式分布,伯努利分布等

1.2 sklearn实现

参考官方文档:点击查看

P ( X ∣ Y ) P(X|Y) P(XY)假设为高斯分布时,称作高斯朴素贝叶斯可通过sklearn库中naive_bayes下的GaussianNB类实现
在这里插入图片描述

有关参数

  • priors:各类别的先验概率,设定后不根据输入数据中的相对频率来计算
  • var_smoothing:控制所有特征中方差最大的部分对方差计算的权重,保证计算方差时的稳定性,

有关属性
在这里插入图片描述

  • class_count_:输入数据中每个类别对应的数量
  • class_prior_:每个类别的概率
  • classes_:模型已知的类别标签
  • epsilon_:方差的绝对相加值,防止方差为0时导致除以0的产生
  • n_features_in_:自变量(特征值)的个数
  • feature_names_in_:自变量的名称,仅当输入自变量有(字符)名称时可用
  • sigma_:已弃用
  • var_:每个类别各特征的方差
  • theta_:每个类别各特征的均值

有关方法
在这里插入图片描述

  • fit:求解高斯朴素贝叶斯模型,即计算每个类别各特征的均值和方差
  • get_params:获取对应模型参数
  • partial_fit:对输入数据的分批增量求解
  • predict:预测类别
  • predict_log_proba:预测概率的对数
  • predict_proba:预测概率
  • score:获取给定数据集的平均准确度
  • set_params:设置对应模型参数

使用案例

>>> import numpy as np
>>> from sklearn.naive_bayes import GaussianNB

>>> clf = GaussianNB() #实例化高斯朴素贝叶斯模型对象
>>> X = np.array([[1, 1], [3, 2], [4, 7], [2, 5]]) #数据
>>> y = np.array([1, 1, 0, 0]) #类别
>>> clf.fit(X, y) #拟合求解
>>> clf.var_
[[1.00..., 1.00...], [1.00..., 0.25...]]
>>> clf.theta_
[[3.00..., 6.00...], [2.00..., 1.50...]]
>>> clf.classes_
[0, 1]
>>> clf.class_prior_
[0.5, 0.5]
>>> clf.epsilon_
5.68...e-9
>>> clf.n_features_in_
2
>>> clf.predict_proba(X)
[[0.00..., 1.00...], [0.00..., 0.99...],
 [1.00..., 0.00...], [1.00..., 0.00...]]
>>> clf.predict([[1, 3], [5, 2]])
[1, 1]
>>> clf.score(X, y)
1.0

另外naive_bayes下通过MultinomialNB类实现 P ( X ∣ Y ) P(X|Y) P(XY)为多项式分布;通过BernoulliNB类实现 P ( X ∣ Y ) P(X|Y) P(XY)为伯努利分布;此外对 P ( X ∣ Y ) P(X|Y) P(XY)的其余假设,点击查看

猜你喜欢

转载自blog.csdn.net/qq_56749449/article/details/125402867