======================================================================= Machine Learning notebook
Python机器学习基础教程(introduction to Machine Learning with Python)
https://github.com/amueller/introduction_to_ml_with_python/blob/master/02-supervised-learning.ipynb
=======================================================================
Nave Bayes
朴素贝叶斯分类器是与线性模型非常相似的一种分类器,但它的训练速度往往更快。这种高效率所付出的代价是,朴素贝叶斯模型的泛华能力要比线性分类器(如LogisticRegression和LinearSVC)稍差。
朴素贝叶斯模型如此高效的原因在于,它通过单独查看每个特征来学习参数,并从每个特种中收集简单的类别统计数据。
scikit-learn中实现了四种朴素贝叶斯分类器:
GaussianNB(高斯朴素贝叶斯):可用于任意连续数据。
BernoulliNB(伯努利朴素贝叶斯):假定输入数据为二分类数据。
MultinomialNB(多项式朴素贝叶斯):假定输入数据为计数数据(即每个特征代表某个对象的整数计数,比如一个单词在句子里出现的次数)
ComplementNB(补充朴素贝叶斯):为了修正标准多项式朴素贝叶斯分类器的“严格假设”,设计了补充朴素贝叶斯分类器。它特别适合于不平衡的数据集。
sklearn.naive_bayes.ComplementNB(alpha=1.0, fit_prior=True, class_prior=None, norm=False)
BernoulliNB和MultinomialNB主要用于文本数据分类。
BernoulliNB分类器计算每个类别中每个特征不为0的元素的个数。
MultinomialNB和GaussianNB计算的统计数据类型略有不同。前者计算每个类别中每个特征的平均值;后者会保存每个类别中每个特征的平均值和标准差。
要想做出预测,需要将数据点与每个类别的统计数据进行比较,并将最匹配的类别作为预测结果。有趣的是,BernoulliNB和MultinomialNB预测公式的形式都与线性模型完全相同。不幸的是,朴素贝叶斯模型coef_de含义与线性模型稍有不同,因为coef_不同于w。
优点、缺点和参数
BernoulliNB和MultinomialNB都只有一个参数alpha,用于控制模型复杂度。alpha的工作原理是,算法向数据中添加alpha这么多的虚拟数据点,这些点对所有特征都取正值。这可以将统计数据“平滑化”(smoothing)。alpha越大,平滑化越强,模型复杂度就越低。算法性能对alpha值得鲁棒性(Robust)相对较好,也就是说,alpha值对模型性能并不重要。但调整这个参数通常都会使精度略有提高。
GaussianNB主要用于高维数据,而另外两种朴素贝叶斯模型则广泛用于稀疏计算数据,比如文本。MultinomialNB的性能通常要优于BernoulliNB,特别是在包含很多非零特征的数据集(即大型文档)上。
朴素贝叶斯模型的许多优点和缺点都与线性模型形同。它的训练和预测速度都很快,训练过程也很容易理解。该模型对高维稀疏数据的效果很好,对参数的鲁棒性也相对较好。朴素贝叶斯模型是很好的基准模型,常用于非常大的数据集,在这些数据集上即使训练线性模型可能也要花费大量时间。