朴素贝叶斯分类器

朴素贝叶斯分类器是一种与线性模型非常相类似的一种分类器。

  • 它的训练速度比线性模型更快,但是泛化能力要强。
  • 主要思想:通过独立查看每个特征来学习参数,并从每个特征中收集简单的类别统计数据
  • scikit-learn实现了三种朴素贝叶斯分类器:1、GaussianNB分类器(高斯)、2、BernoulliNB分类器(伯努利)、3、MultinomNB分类器(多项式)

1、BernoulliNB分类器(伯努利)

  • 该分类器输入数据为二分类数据,主要用于文本数据分类,计算每个类别中每个特征不为0的元素个数

  • 下面是书本中的一个例子,计算每个类别的样本的每个特征所含1的数量:

    X = np.array([[0,1,0,1],
                [1,0,1,1],
                [0,0,0,1],
                [1,0,1,0]])
    y = np.array([0,1,0,1])
    
    counts = {}
    for label in np.unique(y):
        counts[label] = X[y==label].sum(axis=0) #X[y==label]会选出数据中类别为label的样本,之后做跨行求和
    
  • 输出

    {0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])}    
    
  • 📣
    这个例子很形象地说明了BernoulliNB分类器的主要思想是计算每个类别中每个特征不为0的元素个数(把这个作为类别的统计数据),
    若想要做出预测,需要将数据点与每个类别的统计数据进行比较,将最匹配的类别作为预测结果。

  • 而GaussianNB分类器(高斯)、MultinomNB分类器(多项式)也是对每个类别中每个特征计算统计数据,但是计算方式不同罢了,下文会详述。


2、GaussianNB分类器(高斯)

GaussianNB可应用于任意连续数据,

  • 主要用于高维数据,

  • 计算的时候会保存每个类别中每个特征的平均值标准差

  • 运用sklearn.naive_bayes.GaussianNB模块实现GaussianNB

  • 📣
    使用GaussianNB分类器在鸢尾花数据集的测试集上的精度竟然达到了1,比之前的线性模型,KNN都更高

3、MultinomNB分类器(多项式)

MultinomNB假定输入数据为基数数据(即每个特征代表某个对象的整数计数,比如一个单词在句子里出现的次数),

  • 主要用于文本数据分类。
  • 计算类别中每个特征的平均值

4、优点、缺点和参数

BernoulliNB和MultinomNB有一个参数alpha用于控制模型复杂度。

  • alpha越大,平滑化越强,模型复杂度越低。
    • 算法对alpha值的鲁棒性相对较好,因此,alpha值对模型性能并不是很重要,但是调整这个参数通常会使精度有所提高

👍注意

  • 1、GaussianNB主要用于高维数据

    • 连续数据
  • 2、BernoulliNB和MultinomNB主要用于稀疏计数数据,比如文本。

    • MultinomNB在包含很多非零特征的数据集(大型文档)上性能优于BernoulliNB
  • 3、训练速度和预测速度都很快,贝叶斯模型是很好的基准模型,常用于非常大的数据集

参考文献

《Pyhon机器学习基础教程》P53-P54

posted @ 2022-04-20 18:29  朝南烟  阅读(803)  评论(0编辑  收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }