朴素贝叶斯分类算法的sklearn实现

2024-05-02 05:47

1. 朴素贝叶斯分类算法的sklearn实现

1、背景
  
 《机器学习实战》当中,用python根据贝叶斯公式实现了基本的分类算法。现在来看看用sklearn,如何实现。还拿之前的例子,对帖子的分类。数据如下:
                                          
 补充:题目的值左边是几个人的评论,右边是评论属于侮辱类(1)、正常类(0),需要进行文本分类,且再有新的文本过来时能自动划分至0或1。
  
 2、分类
  
 (1)算法的准备
  
 通过查看sklearn的训练模型函数,fit(X, Y),发现只需要准备两个参数。一个是数据的矩阵,另一个是数据的分类数组。首先就是将以上的文本转化成矩阵。
  
 在前一章其实已经讲解过如何将文本转化成矩阵。这里将示意的再补充下。
  
 a.首先选取所有的单词,形成列,也可理解为属性。例如:
                                          
 b.其次将遍历每个文本,填满上述列的值。文本出现过列的次,填一。没有出现过填0。比如第一句就是:my dog has flea problems help please,可表示为:
                                          
 同理所有的文本都可如此表示,所以就形成了一个数字的矩阵。
  
 (2)beyes模型的选择
  
 在完成数据的准备以后,就可以直接调用sklearn的模型和函数完成模型的训练啦。但在beyes模型的选择的时候发现,beyes下有多个模型可选择,所以这个会让人纠结。接下来共同了解下这些模型:
  
 a.高斯模型(GaussianNB)
  
 高斯模型是对于每个属性的值是连续的,且服从高斯分布时可使用:
                                          
 比如人的身高,比如花的高度等等。当然你也可将这些数据离散化,比如按等距划分、等频划分成离散的值,但可能效果都没有直接用高斯模型来计算的好。
  
 用法:class sklearn.naive_bayes.GaussianNB
  
 参数:无
  
 b.多项式模型(MultinominalNB)
  
 如果大部分是多元离散值,则采用多项式模型要好些。多项式模型,通常就是构造参数向量,然后通过极大似然估计来寻求参数的最有值。
                                          
 
  
                                          
 这里只简单的略列一些公式,具体可查询更多资料。从这个计算过程中可得出,这里引入啦一个平滑先验值alpha,这个值在模型训练的时候也会用到。通常alpha>0,可引入不在训练集的特征,尤其当alpha=1,成为拉普拉丝平滑。具体alpha取值对模型的影响可附件的图。
  
 用法:class sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None) 
  
 参数:
  
 alpha:浮点数,就是上述说的引入平滑的值;
  
 fit_prior:bool值,如果为Ture,则不用去学习P(y=ck),以均匀分布替代,否则则去学习P(y=ck)(不懂)
  
 class_prior:一个数组。它指定了每个分类的先验概率P(y=c1),P(y=c2)…..,若指定了该参数 
  
 则每个分类的先验概率无需学习 (不懂)
  
 c.伯努利模型(BernoulliNB)
  
 如果特征值为二元离散值或是稀疏的多元离散值,则可采用伯努利模型。
                                          
 公式:class sklearn.naive_bayes.BernoulliNB(alpha=1.0,binarize=0.0,fit_prior=Ture, 
  
 class_prior=None) 
  
 参数:
  
 binarize:一个浮点数或者None,如果为浮点数则以该数值为界,特征值大于它的取1,小于的为0 。如果为None,假定原始数据已经二值化 
  
 其它参数同上。
  
 
  
  
 通过以上的模型对比和分析,由于文本分析转化后是很多二项取值的稀疏矩阵,因此选取伯努利模型效果会更佳。
                                          
 补充:alpha、binarize值对模型效果的影响

朴素贝叶斯分类算法的sklearn实现