【Sklearn源码机器学习笔记】监督学习之朴素贝叶斯算法

“Sklearn源码机器学习笔记” 系列教程以Scikit-learn 0.19.x库为基础,系列笔记从Sklearn包源码入手进行理解算法,同时对于sklearn文档的部分demo进行深入的学习。

由于能力有限,不足支持请大家多多指正,大家有什么想法也非常欢迎留言评论!

关于我的更多学习笔记,欢迎您关注“武汉AI算法研习”公众号,Sklearn官网最新原版英文文档下载,公众号回复“sklearn”。

本文分三个部分“【高斯朴素贝叶斯】”、“【多项式朴素贝叶斯】”、“【伯努利朴素贝叶斯】”来进行展开,总共阅读时间大约10分钟。

关于朴素贝叶斯原理方法文章,可见公众号文章“李航《统计学习方法》学习笔记之——第四章:朴素贝叶斯法”

朴素贝叶斯算法中,常用的又分为了高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯三种,Sklearn对于常用三种朴素贝叶斯方法进行了封装,其sklearn.naive_bayes模块就封装了朴素贝叶斯常用方法。

【Sklearn源码机器学习笔记】监督学习之朴素贝叶斯算法_第1张图片

 

【高斯朴素贝叶斯】

高斯朴素贝叶斯算法是一种特殊类型的NB算法,它特别用于当特征具有连续值时,同时假定所有特征符合高斯分布,比如通过升高和体重预测性别中,由于升高和体重特征值都是连续的数值。Sklearn中GaussianNB()类是朴素贝叶斯分类方法的具体实现。

navie_bayes.GaussianNB(priors = None, var_smoothing)

以上参数中priors为先验概率,一般默认为None,当默认为None时,先验概率自动根据类别数和样本数进行计算,当给出先验概率以给出为准。var_smoothing是为了解决各个维度之间的数据差异问题,为了计算不出错。

#np.var(X, axis=0).max()得到个特征均值最大值
#如果维度之间的数据差异比率太小,则会导致数值错误。 
#为了解决这个问题,我们通过epsilon人为地增加方差,这是最大维度标准差的一小部分。
elf.epsilon_ = self.var_smoothing * np.var(X, axis=0).max()

self.sigma_[:, :] += self.epsilon_
self.sigma_[:, :] -= self.epsilon_

GaussianNB()类属性包括:

  1. class_prior_:每个样本的概率;
  2. class_count_:每个类别的样本数量;
  3. theta_:每个类别中每个特征的均值;
  4. sigma_:每个类别中每个特征的方差;
  5. epsilon_:方差的绝对附加值(调整方差);
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB(priors=None, var_smoothing=1e-09)
clf.fit(X, Y)

print "==Predict result by predict==直接给出测试集的预测类别输出"
print(clf.predict([[-0.8, -1]]))
print "==Predict result by predict_proba==给出测试集样本在各个类别上预测的概率"
print(clf.predict_proba([[-0.8, -1]]))
print "==Predict result by predict_log_proba==给出测试集样本在各个类别上预测的概率的一个对数转化"
print(clf.predict_log_proba([[-0.8, -1]]))

 

【多项式朴素贝叶斯】

多用于离散特征分类,例如文本分类单词统计,以出现的次数作为特征值。

sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

MultinomialNB()类参数:

  1. alpha:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑,如果不做平滑,当某一维特征的值没在训练样本出现过时,会导致条件概率值为0,从而导致后验概率为0。
  2. fit_prior:是否去学习类的先验概率,默认是True
  3. class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

MultinomialNB()类属性:

  1. class_log_prior_:每个类别平滑后的先验概率
  2. intercept_:是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同
  3. feature_log_prob_:给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+alpha)/(指定类下所有特征出现次数之和+类的可能取值个数*alpha)
  4. coef_:是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同
  5. class_count_: 训练样本中各类别对应的样本数
  6. feature_count_:每个类别中各个特征出现的次数
import numpy as np
X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
print(clf.predict(X[2:3]))

 

【伯努利朴素贝叶斯】

与多项式模型一样,伯努利朴素贝叶斯适用于离散特征情况,只是伯努利模型中每个特征的取值必须为0或1

sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize= 0, fit_prior=True, class_prior=None)

BernoulliNB()类参数:

  1. alpha:平滑因子,与多项式中的alpha一致。
  2. binarize:样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化形式了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
  3. fit_prior:是否去学习类的先验概率,默认是True
  4. class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

BernoulliNB()类属性:

  1. class_log_prior_:每个类别平滑后的先验对数概率。
  2. feature_log_prob_:给定特征类别的经验对数概率。
  3. class_count_:拟合过程中每个样本的数量。
  4. feature_count_:拟合过程中每个特征的数量。
import numpy as np
X = np.random.randint(2, size=(6, 100))
Y = np.array([1, 2, 3, 4, 4, 5])
from sklearn.naive_bayes import BernoulliNB
clf = BernoulliNB()
clf.fit(X, Y)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
print(clf.predict(X[2:3]))

 

[参考文献]

[1] 朴素贝叶斯理论推导与三种常见模型

[2] Sklearn参数详解—贝叶斯

[3] scikit-learn 朴素贝叶斯类库使用小结

 

 

你可能感兴趣的:(Sklearn源码,朴素贝叶斯算法,sklearn朴素贝叶斯)