【机器学习实战(四)】sklearn包中朴素贝叶斯库的使用

目录

    1. 朴素贝叶斯相关知识点回顾
    • 1.1. 什么是朴素贝叶斯分类器
    • 1.2. 朴素贝叶斯推断
    • 1.3. 朴素贝叶斯学习
    1. sklearn中朴素贝叶斯类库的简介
    • 2.1. GaussianNB类
    • 2.2. MultinomialNB类
    • 2.3. BernoulliNB类

这是《西瓜书带学训练营·实战任务》系列的第四篇笔记

1. 朴素贝叶斯相关知识点回顾

1.1. 什么是朴素贝叶斯分类器

判别式模型(discriminative models):像决策树、BP神经网络、支持向量机等,都可以归入判别式模型,它们都是直接学习出输出Y与特征X的关系,如:

  • 决策函数 Y=f(X)
  • 条件概率 P(Y|X)

生成式模型 (gernerative models):先对联合概率分布 P(X,Y) 进行建模,然后再由此获得P(Y|X) = P(X,Y)/P(X)

贝叶斯学派的思想:

贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率,可以通过先验概率和数据一起综合得到。数据大家好理解,被频率学派攻击的是先验概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,beta分布等。这个假设一般没有特定的依据,因此一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,但是在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类

如何对P(X,Y)进行建模?

假如我们的分类模型样本是:

(x(1)1,x(1)2,...x(1)n,y1), (x(2)1,x(2)2,...x(2)n,y2),...(x(m)1,x(m)2, ..., x(m)n,ym)

P(X, Y) = P(Y) * P( X = (x1, x2, ..., xn) | Y )

其中

P( X = (x1, x2, ..., xn) | Y ) = P( x1 | Y) * P( x2 | Y, x1) * ... P( xn | Y, x1, ... , xn-1)

这是一个超级复杂的有n个维度的条件分布,很难求出

朴素贝叶斯模型在这里做了一个大胆的假设,即X的n个维度之间相互独立,这样就可以得出:

P( X = (x1, x2, ..., xn) | Y ) = P( x1 | Y) * P( x2 | Y) * ... * P( xn | Y)

1.2. 朴素贝叶斯推断

1.3. 朴素贝叶斯学习

需要从训练样本中学习到以下两个参数:

  • 先验概率 P(c)

    P(c)表示了样本空间中各类样本所占的比例

    根据大数定律,当训练集中包含充足的独立同分布样本时,P(c)可根据各类样本出现的频率来估计

  • 类条件概率(又称为似然) P(xi | c)

    (1)如果 xi 是离散的,可以假设 xi符合多项式分布,这样得到 P(xi | c) 是在样本类别 c 中,特征 xi 出现的频率

    (2)如果 xi 是连续属性,可以假设 P(xi | c) ~ N( μc,i , σ2c,i )

2. sklearn中朴素贝叶斯类库的简介

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类

  • GaussianNB:先验为高斯分布的朴素贝叶斯

  • MultinomialNB:先验为多项式分布的朴素贝叶斯

  • BernoulliNB:先验为伯努利分布的朴素贝叶斯

这三个类适用的分类场景各不相同

一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好

如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适

如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

2.1. GaussianNB类

GaussianNB类的主要参数仅有一个,即先验概率priors

这个值默认不给出,如果不给出此时P(Y=c)= mc / m,如果给出的话就以priors 为准

在使用GaussianNB的fit方法拟合数据后,我们可以进行预测。此时预测有三种方法

  • predict方法:就是我们最常用的预测方法,直接给出测试集的预测类别输出;

  • predict_proba方法:给出测试集样本在各个类别上预测的概率;

  • predict_log_proba方法:和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化;

from sklearn.naive_bayes import GaussianNB

clf = GaussianNB()
#拟合数据
clf.fit(X, Y)

#进行预测
clf.predict([[-0.8, -1]])

2.2. MultinomialNB类

MultinomialNB假设特征的先验概率为多项式分布,即如下式:

MultinomialNB参数比GaussianNB多,但是一共也只有仅仅3个

  • 参数alpha:为上面的常数λ。如果你没有特别的需要,用默认的1即可。如果发现拟合的不好,需要调优时,可以选择稍大于1或者稍小于1的数

  • 参数fit_prior:是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率;否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数class_prior让MultinomialNB自己从训练集样本来计算先验概率

  • 参数class_prior:输入先验概率,若不输入第三个参数class_prior让MultinomialNB自己从训练集样本来计算先验概率

2.3. BernoulliNB类

其中,x i 只能取0或1

BernoulliNB一共有4个参数,其中3个参数的名字和意义和MultinomialNB完全相同

唯一增加的一个参数是binarize,这个参数主要是用来帮BernoulliNB处理二项分布的。如果不输入,则BernoulliNB认为每个数据特征都已经是二元的。否则的话,小于binarize的会归为一类,大于binarize的会归为另外一类


参考资料:

(1) 周志华《机器学习》

(2) 刘建平Pinard《朴素贝叶斯算法原理小结》

(3) 刘建平Pinard《scikit-learn 朴素贝叶斯类库使用小结》

你可能感兴趣的:(【机器学习实战(四)】sklearn包中朴素贝叶斯库的使用)