机器学习理论大会战——朴素贝叶斯(分类实践)
Posted AI雄霸天下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习理论大会战——朴素贝叶斯(分类实践)相关的知识,希望对你有一定的参考价值。
伯努利贝叶斯分类器实践示例
现在,我们就来看一下有关BernoulliNB分类器在乳腺癌数据集上的一个具体表现。注意:这里不光要注意三种不同的贝叶斯分类器在同一数据集上的表现,最好还要与前面所介绍的线性模型中的Logistic回归算法或线性支持向量机分类算法在乳腺癌数据集上的表现做个对比,这样更有利于加深对各个已分享算法的理解。
步入正题,我们来看一下BernoulliNB分类器的作用:
import numpy as np
from sklearn.naive_bayes import BernoulliNB
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
#这里的random_state的值,大家也可以做一些改变,看看
#在不同的random_state值下所产生的训练集会对模型的
#预测精度值产生什么样的影响
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=42)
clf = BernoulliNB()
clf.fit(X_train,y_train)
print("训练集上预测精度:%.3f"%clf.score(X_train, y_train))
print("测试集上预测精度:%.3f"%clf.score(X_test, y_test))
其运行结果如下:
训练集上预测精度:0.627
测试集上预测精度:0.629
从结果来看,不甚理想:训练集与测试集上的预测精度都比较低,且差距不大,说明伯努利贝叶斯分类算法在当前的数据集上表现并不优异,出现了欠拟合现象。
我尝试着调整伯努利贝叶斯分类器的模型复杂度参数——alpha的值,但得到的结果与现在的结果并无多大区别。看来在当前的乳腺癌数据集上,其表现确实有些差强人意。
高斯贝叶斯分类器实践示例
看完伯努利贝叶斯分类器在乳腺癌数据集上的表现,我们再来感受一下高斯贝叶斯分类器在同一个数据集上的表现,看看能否有所好转:
import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
#这里的random_state的值,大家也可以做一些改变,看看
#在不同的random_state值下所产生的训练集会对模型的
#预测精度值产生什么样的影响
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=42)
clf = GaussianNB()
clf.fit(X_train,y_train)
print("训练集上预测精度:%.3f"%clf.score(X_train, y_train))
print("测试集上预测精度:%.3f"%clf.score(X_test, y_test))
其运行结果如下:
训练集上预测精度:0.946
测试集上预测精度:0.937
对比伯努利贝叶斯分类器来看,高斯朴素贝叶斯分类器在乳腺癌数据集上的表现要好很多。怪不得高斯朴素贝叶斯分类器那么出名,估计是跟高斯理论一结合的算法,就木有不好使的,哈哈哈。
多项式朴素贝叶斯分类器实践示例
现在,我们来看第三种常见的朴素贝叶斯分类器在乳腺癌数据集上的表现如何:
import numpy as np
from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
#这里的random_state的值,大家也可以做一些改变,看看
#在不同的random_state值下所产生的训练集会对模型的
#预测精度值产生什么样的影响
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=42)
clf = MultinomialNB()
clf.fit(X_train,y_train)
print("训练集上预测精度:%.3f"%clf.score(X_train, y_train))
print("测试集上预测精度:%.3f"%clf.score(X_test, y_test))
其运行结果如下:
训练集上预测精度:0.887
测试集上预测精度:0.923
从结果来看,多项式朴素贝叶斯分类器在同一个数据集上的工作表现介于伯努利朴素贝叶斯分类器与高斯朴素贝叶斯分类器之间。同时,我还发现,在多项式朴素贝叶斯分类器中,通过调节控制分类器模型复杂程度的参数——alpha的值,其预测精度值也会有所改变,当alpha值不断增大时,预测精度值就会逐渐下降。但是alpha值从默认取值1变得更小时,其预测精度值与模式取值下的精度值相差无几,甚至可以说毫无变化。
这一点大家也务必要多加注意。因为在不同的数据集上开展机器学习的学习任务,有时就需要通过调整这些参数来达到改变预测精度值的效果。要知道,我们所知的任何一种机器学习算法没有一种是不好的,只是它们如果被用在不适当的数据集上或者参数给的不合理,自然表现也就不会有多好。但这并非是算法本身的问题。就好比一块砖,用于建房子自然是物尽其用,可若用来挡风,那就有点暴殄天物的赶脚了。
当然,如何合理的给算法取参数值,这是一种深奥的技巧,后续我们在介绍有关机器学习的模型评估与优化时会介绍几种自动化的参数调优算法。
总结
到此为止,我们就简单介绍了有关朴素贝叶斯的基本数学原理、相关概率计算公式、类别决策依据、简单计算示例以及朴素贝叶斯在Scikit-learn库中的三个典型算法的具体实践举例。
相信通过这几方面的知识,大家能够对朴素贝叶斯有一个深入的了解。下面我借用一位前辈对朴素贝叶斯的总结来结束有关朴素贝叶斯知识的分享:
MultinomialNB和BernoulliNB都有一个参数alpha,用于控制模型复杂度。alpha 的工作原理是,算法向数据中添加alpha这么多的虚拟数据点,这些点对所有特征都取正值。这可以将统计数据“平滑化”(smoothing)。alpha 越大,平滑化越强,模型复杂度就越低。算法性能对alpha值的鲁棒性相对较好,也就是说,alpha值对模型性能并不重要。但调整这个参数通常都会使精度略有提高。
GaussianNB主要用于高维数据,而另外两种朴素贝叶斯模型则广泛用于稀疏计数数据,比如文本。MultinomialNB的性能通常要优于BernoulliNB,特别是在包含很多非零特征的数据集(即大型文档)上。
朴素贝叶斯模型的许多优点和缺点都与线性模型相同。它的训练和预测速度都很快,训练过程也很容易理解。该模型对高维稀疏数据的效果很好,对参数的鲁棒性也相对较好。朴素贝叶斯模型是很好的基准模型,常用于非常大的数据集,在这些数据集上即使训练线性模型可能也要花费大量时间。
本节的分享就到此为止,谢谢大家。
以上是关于机器学习理论大会战——朴素贝叶斯(分类实践)的主要内容,如果未能解决你的问题,请参考以下文章