原文地址:Naive Bayes Classifiers
本文讨论的是朴素贝叶斯分类器( Naive Bayes classifiers)背后的理论以及其的实现。
朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法。它不是单一存在的,而是一个算法家族,在这个算法家族中它们都有共同的规则。例如每个被分类的特征对与其他的特征对都是相互独立的。
开始之前,先看一下数据集。
这是一个虚构的数据集,这个数据集描述的是天气是否适合打高尔夫球。已知天气情况,每个元组都分成合适(“Yes”)或者不合适(“NO”)打高尔夫。
下面的截图就是表示的数据集表格:
数据集分为两个部分,也就是说,特征矩阵(feature matrix)和响应向量(response vector)。
假设
朴素贝叶斯基础假设是,对于每一个特征都有:
来支持输出结果。
与我们的数据集关联起来,我们可以这样理解这个概念:
注意:如果在现实情况中,这个假设就使得朴素贝叶斯不能一般性地正确了。实际上独立这个假设就根本不可能成立,但是又往往在实践中能够很方便地计算。
在进入朴素贝叶斯方程之前,要知道贝叶斯理论是十分重要的。
贝叶斯理论
贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:
现在再考虑一下我们的数据集,我们可以这样用贝叶斯理论:
在这里y是类变量,X是依赖特征向量(大小为n):
为了更加清晰点,我们这个例子的特征向量和相关类变量是(数据集的第一行):
X = (Rainy, Hot, High, False)
y = No
所以 P(X|y) 在这里的意思就是已知天气情况为:“Rainy outlook”, “Temperature is hot”, “high humidity”和“no wind”,得到“Not playing golf”的概率。
现在是时候为贝叶斯理论添加假设了,也就是每个特征之间都是相互独立的。所以我们可以将证据分成每个独立的部分。
如何两个事件A和B是相互独立的,那么有:
因此我们可以得到以下结果:
于是又可以写成:
因为分母与输入数据是常量相关的,所以我们可以除去这一项:
现在我们需要建立一个分类模型,我们用已知的类变量 y 的所有可能的值计算概率,并选择输出概率是最大的结果。数学表达式可以这么写:
所以最后剩下的只有 P(y) 与 P(xi|y) 的计算了。
请注意: P(y) 也被称为类概率, P(xi|y) 也被称为条件概率。
不同的朴素贝叶斯分类器差异主要在 P(xi|y) 分布的假设。
我们试着将上面的式子用在天气数据集上。这样,我们先对数据集做一些预处理。
我们得求出每一个 X 中的 xi , y 中的 yi 。所有这些计算都被列在了下面的表格中:
所以在上图中,我们已经在表格1-4中手工计算了每一个 X 中的 xi , y 中的 yi 。例如打高尔夫的概率已知的是温度是cool,例如 P(temp=cool|playgolf=Yes)=3/9 。
我们也需要求出类概率( P(y) ),这个在表格5中已经计算出来了。例如 P(playgolf=Yes)=9/14 。
直到现在我们已经完成了预处理工作,分类器也准备好了。
today = (Sunny, Hot, Normal, False)
所以玩高尔夫的概率是:
不打高尔夫的概率是:
因为 P(today) 在两个概率中都用到了,我们可以忽略 P(today) ,然后再找到等比例的概率:
因为
所以这些数字可以做一下归一化:
因为
所以预测结果应该是“Yes”。
上述讨论的方法只能应用在离散数据上。如果是连续数据的话,我们需要对每个特征数据的分布做一些假设。不同的朴素贝叶斯分类器差异主要在 P(xi|y) 分布的假设。
下面我们讨论一个这样的分类器:
在高斯朴素贝叶斯中,每个特征都是连续的,并且都呈高斯分布。高斯分布又称为正态分布。图画出来以后像一个倒挂的钟,以均值为轴对称,如下图所示:
特征的似然被假设为高斯分布了,那么条件概率函数可以写为:
现在我们看一下用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)
输出:
Gaussian Naive Bayes model accuracy(in %): 95.0
其他比较流行的朴素贝叶斯分类器:
在文章的最后,有一些要点需要考虑下:
参考文献: