本文讨论的是朴素贝叶斯分类器( Naive Bayes classifiers)背后的理论以及其的实现。
朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法。它不是单一存在的,而是一个算法家族,在这个算法家族中它们都有共同的规则。例如每个被分类的特征对与其他的特征对都是相互独立的。
开始之前,先看一下数据集。
这是一个虚构的数据集,这个数据集描述的是天气是否适合打高尔夫球。已知天气情况,每个元组都分成合适(“Yes”)或者不合适(“NO”)打高尔夫。
下面的截图就是表示的数据集表格:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/105eda84c98a37027b93f2d551f4e9a1.png)
数据集分为两个部分,也就是说,特征矩阵(feature matrix)和响应向量(response vector)。
- 特征矩阵包含数据集中所有的向量(行),每个向量是由依赖特征组成的。在上面的数据集中,特征就是“天气”,“温度”,“湿度”还有“刮风”。
- 响应向量包含的是特征矩阵每一行的类变量(预测或者输出)值。在上述的数据集中,类变量名为“Play golf”。
假设
朴素贝叶斯基础假设是,对于每一个特征都有:
- 独立
- 相等
来支持输出结果。
与我们的数据集关联起来,我们可以这样理解这个概念:
- 我们假设没有特征对是相互依赖的。温度热不热跟湿度没有任何关系,天气是否下雨也不影响是否刮风。因此,这就是假设特征相互独立。
- 其次,每个特征都有相同的权重(或者是重要性)。例如,只知道温度和湿度是不能准确地推断出结果的。任何属性都与结果是有关系的,并且影响程度是相同的。
注意:如果在现实情况中,这个假设就使得朴素贝叶斯不能一般性地正确了。实际上独立这个假设就根本不可能成立,但是又往往在实践中能够很方便地计算。
在进入朴素贝叶斯方程之前,要知道贝叶斯理论是十分重要的。
贝叶斯理论
贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:
- 基本上,只要我们给出了事件B为真,那么就能算出事件A发生的概率,事件B也被称为证据。
- P(A)是事件A的先验(先验概率,例如,在证据之前发生的概率)。证据是一个未知事件的一个属性值(在这里就是事件B)。
- P(A|B)是B的后验概率,例如在证据之后发生的概率。
现在再考虑一下我们的数据集,我们可以这样用贝叶斯理论:
在这里y是类变量,X是依赖特征向量(大小为n):
为了更加清晰点,我们这个例子的特征向量和相关类变量是(数据集的第一行):
X = (Rainy, Hot, High, False)
y = No
- 1
- 2
所以P(X|y)P(X|y)在这里的意思就是已知天气情况为:“Rainy outlook”, “Temperature is hot”, “high humidity”和“no wind”,得到“Not playing golf”的概率。
朴素假设
现在是时候为贝叶斯理论添加假设了,也就是每个特征之间都是相互独立的。所以我们可以将证据分成每个独立的部分。
如何两个事件A和B是相互独立的,那么有:
因此我们可以得到以下结果:
于是又可以写成:
因为分母与输入数据是常量相关的,所以我们可以除去这一项:
现在我们需要建立一个分类模型,我们用已知的类变量yy的所有可能的值计算概率,并选择输出概率是最大的结果。数学表达式可以这么写:
所以最后剩下的只有P(y)P(y)与P(xi|y)P(xi|y)的计算了。
请注意:P(y)P(y)也被称为类概率,P(xi|y)P(xi|y)也被称为条件概率。
不同的朴素贝叶斯分类器差异主要在P(xi|y)P(xi|y)分布的假设。
我们试着将上面的式子用在天气数据集上。这样,我们先对数据集做一些预处理。
我们得求出每一个XX中的xixi,yy中的yiyi。所有这些计算都被列在了下面的表格中:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/5524d6bab37b6660073b1c759e30ed0e.png)
所以在上图中,我们已经在表格1-4中手工计算了每一个XX中的xixi,yy中的yiyi。例如打高尔夫的概率已知的是温度是cool,例如P(temp=cool|playgolf=Yes)=3/9P(temp=cool|playgolf=Yes)=3/9。
我们也需要求出类概率(P(y)P(y)),这个在表格5中已经计算出来了。例如P(playgolf=Yes)=9/14P(playgolf=Yes)=9/14。
直到现在我们已经完成了预处理工作,分类器也准备好了。
today = (Sunny, Hot, Normal, False)
- 1
所以玩高尔夫的概率是:
不打高尔夫的概率是:
因为P(today)P(today)在两个概率中都用到了,我们可以忽略P(today)P(today),然后再找到等比例的概率:
因为
所以这些数字可以做一下归一化:
因为
所以预测结果应该是“Yes”。
上述讨论的方法只能应用在离散数据上。如果是连续数据的话,我们需要对每个特征数据的分布做一些假设。不同的朴素贝叶斯分类器差异主要在P(xi|y)P(xi|y)分布的假设。
下面我们讨论一个这样的分类器:
高斯朴素贝叶斯分类器
在高斯朴素贝叶斯中,每个特征都是连续的,并且都呈高斯分布。高斯分布又称为正态分布。图画出来以后像一个倒挂的钟,以均值为轴对称,如下图所示:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/f43dbe9a3f910528a02e83bd68e00d83.gif)
特征的似然被假设为高斯分布了,那么条件概率函数可以写为:
现在我们看一下用scikit-learn实现的高斯朴素贝叶斯。
# load the iris dataset
from sklearn.datasets import load_iris
iris = load_iris()
# store the feature matrix (X) and response vector (y)
X = iris.data
y = iris.target
# splitting X and y into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
# training the model on training set
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)
# making predictions on the testing set
y_pred = gnb.predict(X_test)
# comparing actual response values (y_test) with predicted response values (y_pred)
from sklearn import metrics
print("Gaussian Naive Bayes model accuracy(in %):", metrics.accuracy_score(y_test, y_pred)*100)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
输出:
Gaussian Naive Bayes model accuracy(in %): 95.0
- 1
其他比较流行的朴素贝叶斯分类器:
- 多项式朴素贝叶斯:特征向量表示由多项式分布生成的特定事件的频率。这是用于文件分类的典型的事件模型。
- 伯努利朴素贝叶斯:在多变量的伯努利事件模型中,特征是独立的布尔(二进制变量)类型来描述输入。跟多项式模型类似,这个模型在文件分类中也很流行,在这里用的是二进制项的出现(一个词是否出现在文件中),而不是词频(一个文件中出现某个单词的次数)。
在文章的最后,有一些要点需要考虑下:
- 尽管他们貌似过度简化了假设,朴素贝叶斯分类器在真实世界中的应用还是很不错的,其中著名的文件分类和垃圾邮件过滤就是例子。它只要少量的训练数据就能估计出关键的参数。
- 与其他的复杂方法相比,朴素贝叶斯学习和分类的速度非常快。类条件特征分布的波动意思就是每个分布可以独立地被一个尺寸分布估计出来。这就减轻了维度带来的问题。
参考文献: