Python机器学习基础教程学习笔记(7)——朴素贝叶斯分类器
朴素贝叶斯分类器(Naive Bayesian Classifier)
- 朴素贝叶斯分类器比线性模型训练速度更快
- 代价是泛化能力要比线性更稍差
朴素贝叶斯模型如此高效的原因在于:
- 它通过单独查看每个特征来学习参数,并从每个特征中收集简单的类别统计数据
sk-learn中实现了三种朴素贝叶斯分类器:
- GaussianNB:应用于任意连续数据。
- BernoulliNB:假定输入的数据为二分类数据。
- MultifomialNB:假定输入数据为计数数据。
BernoulliNB和MultifomialNB主要用于文本数据分类。
BernoulliNB分类器计算每个类别中每个特征不为0的元素个数。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
# 4个数据点,每个点有4个二分特征
X = np.array([
[0,1,0,1], # 类别0:
[1,0,1,1], # 类别1:
[0,0,0,1], # 类别0:
[1,0,1,0] # 类别1:
])
# 一共有两个类别:0和1
y = np.array([0,1,0,1])
counts = {}
# 计算每个类别中每个特征不为0的元素个数
for label in np.unique(y):
counts[label]=X[y==label].sum(axis=0)
print("Feature counts:\n{}".format(counts))
Feature counts:
{0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])}
- MultifomialNB计算每个类别中每个特征的平均值。
- GaussianNB会保存每个类别中每个特征的平均值和标准差。
- 要想做出预测,需要将数据点与每个类别的统计数据进行比较,并将最匹配的类别作为预测结果。
- MultifomialNB和BernoulliNB预测公式的形式都与线性模型完全相同。
- 朴素贝叶斯模型coef_的含义与线性模型稍有不同,因为coef_不同与w。
优点、缺点和参数
-
MultinomialNB和BernoulliNB都有一个参数alpha,用于控制模型复杂度。
-
alpha的工作原理是,算法向数据中添加alpha那么多的数据点,这些点对所有特征都取正值。这可以将统计数据“平滑化”(smoothing)。
-
alpha越大,平滑性越强,模型复杂度就越低。
-
算法性能对alpha值的鲁棒性相对较好,也就是说,alpha值对模型性能并不重要。
-
但是调整这个参数通常都会使精度略有提高。
-
GaussianNB主要用于高维数据,而另外两种朴素贝叶斯模型则广泛用于稀疏计数数据,比如文本。
-
MultinomialNB的性能通常要优于BernoulliNB,特别是在饮食很多非零特征的数据集(即大型文档)上。
-
朴素贝叶斯模型的许多优点和缺点都与线性模型相同。
-
它的训练和预测速度都很快,训练过程也很容易理解。
-
该模型对高维稀疏数据的效果很好,对参数的鲁棒性也相对较好。
-
朴素贝叶斯 模型是很好的基准模型,常用于非常大的数据集,在这些数据集上即使训练线性模型可能也要花费大量时间。
网友评论