朴素贝叶斯分类器

朴素贝叶斯分类器是和线性模型非常相似的一种分类器,但它的训练速度往往更快。这种高效率所付出的代价是,朴素贝叶斯模型的泛化能力要比线性分类器(如LogisticRegression和LinearSVC)稍差。
朴素贝叶斯模型如此高效的原因在于,它通过单独查看每个特征来学习参数,并从每个特征中收集简单的类别统计数据。scikit-learn中实现了三种朴素贝叶斯分类器:GaussianNB、BernoulliNB和MultinomialNB。GaussianNB可应用于任意连续数据,而BernoulliNB假定输入数据为二分类数据,MultinomialNB假定输入数据为计数数据(即每个特征代表某个对象的整数计数,比如一个单词在句子里出现的次数)。BernoulliNB和MultinomialNB主要用于文本数据分类。
BernoulliNB分类器计算每个类别中每个特征不为0的元素个数。
用一个例子来说明会很容易理解:

import sys
print("Python version:{}".format(sys.version))

import pandas as pd
print("pandas version:{}".format(pd.__version__))

import matplotlib
print("matplotlib version:{}".format(matplotlib.__version__))
import matplotlib.pyplot as plt

import numpy as np
print("Numpy version:{}".format(np.__version__))

import scipy as sp
print("Scipy version:{}".format(sp.__version__))

import IPython
print("IPython version:{}".format(IPython.__version__))

import sklearn
print("scikit-learn version:{}".format(sklearn.__version__))

import mglearn

Python version:3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]
pandas version:0.23.4
matplotlib version:3.0.2
Numpy version:1.15.4
Scipy version:1.1.0
IPython version:7.2.0
scikit-learn version:0.20.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])

这里我们有4个数据点,每个点有4个二分类特征,一共有两个类别:0和1。对于类别0(第1、3个数据点),第一个特征有2个为零,0个不为零,第二个特征有1个为零,1个不为零,以此类推。然后对类别1中的数据点计算相同的计数。计算每个类别中的非零元素个数,大体上看起来像这样:

counts={}
for label in np.unique(y):
    # 对每个类别进行遍历
    # 计算(求和)每个特征中1的个数
    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])}
另外两种朴素贝叶斯模型(MultinomialNB和GaussianNB)计算的统计数据类型略有不同,Multinomial计算每个类别中每个特征的平均值,而GaussianNB会保存每个类别中国每个特征的平均值和标准差。
要想做出预测,需要将数据点与每个类别的统计数据进行比较,并将最匹配的类别作为预测结果。有趣的是,MultinomialNB和BernoulliNB预测公式的形式都与线性模型完全相同。不幸的是,朴素贝叶斯模型coef_的含义与线性模型稍有不同,因为coef_不同于w。

优点、缺点和参数

MultinomialNB和BernoulliNB都只有一个参数alpha,用于控制模型复杂度。alpha的工作原理是,算法向数据中添加alpha这么多的虚拟数据点,这些点对所有特质都去正值。这可以将统计数据“平滑化”(smoothing)。alpha越大,平滑化越强,模型复杂度就越低。算法性能对alpha值得鲁棒性相对较好,也就是说,alpha值对模型性能并不重要、但调整这个参数通常都会使精度略有提高。
GaussianNB主要用于高维数据,而另外两种朴素贝叶斯模型则更广泛用于稀疏统计数据,比如文本。MultinomialNB的性能通常要优于BernoulliNB,特别是在很多非零特征的数据集(即大型文档)上。
朴素贝叶斯模型的许多优点和缺点都与线性模型相同。它的训练和预测速度都很快,训练过程也很容易理解。该模型对高维稀疏数据的效果很好,对参数的鲁棒性也相对较好。朴素贝叶斯模型时很好的基准模型,常用于非常大的数据集,在这些数据集上即使训练线性模型可能也要花费大量时间。

你可能感兴趣的:(朴素贝叶斯分类器)