机器学习之朴素贝叶斯模型及代码示例

来源:互联网 发布:武汉大学网络教育平台 编辑:程序博客网 时间:2024/04/29 18:46

一、朴素贝叶斯的推导

朴素贝叶斯学习(naive Bayes)是一种有监督的学习,训练时不仅要提供训练样本的特征向量X,而且还需提供训练样本的实际标记Y,是一种基于贝叶斯定理和特征条件独立假设的分类方法。

1. 贝叶斯定理:

贝叶斯定理:这里写图片描述

对于分类问题,其中 这里写图片描述 可看作 在样本的特征为X的条件下,样本的类别为Y的条件概率,这正是分类问题中我们想求的;

而右边中的 这里写图片描述 可看作 训练集中样本类别为Y的概率 ,这里写图片描述 可看作 在训练集中特征为X时,样本类别为Y的条件概率,这里写图片描述 可看作 训练集中特征为X的样本概率。可看出,右边的值我们是可以通过计算得到的。其中 这里写图片描述这里写图片描述 分别为 X和Y的先验概率,其值与训练集的选择有一定的关系。

2. 特征条件独立假设

由 1 可知,特征向量 X 的维度不一定是一维的,可能是多维的:这里写图片描述

因此 样本类别Y 的取值 这里写图片描述 是跟 样本的每一个维度取值有关的。因此可由贝叶斯定理得出下式:

这里写图片描述

又因为 朴素贝叶斯 对条件概率分布进行了条件独立性的假设,即同一类别中,样本的每一维度的特征都是 独立的 。朴素贝叶斯之所以“朴素”正因为这一假设。因此可有:

这里写图片描述

于是可得:

这里写图片描述

又由 全概率分布公式 可得:

这里写图片描述

因此我们想要得到的 样本类别y 为:

这里写图片描述

即 将概率最高的那个标记 这里写图片描述 作为预测样本的标签。

又因对于 每一个类别标记 来说:

这里写图片描述 为一常数。

因此 概率最高的样本类别y 可简化表示为:

这里写图片描述

因此 这里写图片描述这里写图片描述 的求值是关键。

二、朴素贝叶斯常用模型

在不同的朴素贝叶斯模型中, 这里写图片描述 的求值也不同。下列为朴素贝叶斯常见的三种模型。

1. 高斯朴素贝叶斯模型

在高斯朴素贝叶斯模型中,特征向量 X 的特征 通常为 连续型变量,并且假定所有特征的取值是符合高斯分布的,即:

这里写图片描述

其中 参数 这里写图片描述这里写图片描述 可通过 极大似然估计(MLE) 求得:

这里写图片描述

这里写图片描述

其中 这里写图片描述 为 样本类别为 这里写图片描述 的样本数量,这里写图片描述 为 类别为 这里写图片描述 的第 j 个样本的第 i 个特征的值。

由上可取得 概率最高的样本类别y :

这里写图片描述

2. 多项分布朴素贝叶斯模型

在多项分布朴素贝叶斯模型中,特征向量 X 的特征 通常为 离散型变量,并且假定所有特征的取值是符合多项分布的,可用于文本分类。对每一个样本类别 这里写图片描述 ,有对应的参数向量 这里写图片描述

其中 n 为样本特征的维度,且令 这里写图片描述

其中 参数 这里写图片描述 同样可以通过 极大似然估计 (MLE)求得:

这里写图片描述

其中 这里写图片描述 为 类别为这里写图片描述的样本的所有特征出现的总次数,可看作 类别为这里写图片描述的样本的所有特征值的总和。

其中 这里写图片描述 为 类别为这里写图片描述的样本的第 i 个特征出现的总次数,可看作 类别为这里写图片描述的样本的第 i 个特征值的总和。

又因为为了避免训练集样本对一些特征的缺失,即某一些特征出现的次数为0(特征值的总和为0),从而导致  为 0,进而导致预测的概率为 这里写图片描述 ,而且甚至会出现 0 除以 0 这种情况。

因为我们需要对 参数这里写图片描述 进行平滑处理,可有:

这里写图片描述

其中 n 为训练集样本特征的维度,这里写图片描述 为平滑系数 ,当 这里写图片描述 = 1时,称为 Laplace平滑;当 这里写图片描述 < 1时,成为 Lidstone平滑。

我们可发现,平滑后的公式 这里写图片描述

对于其对应的类别 这里写图片描述 来说,还是保持着 这里写图片描述

这里写图片描述 = 类别为这里写图片描述的样本的所有特征的特征值总和 / 训练集所有样本的所有特征的特征值总和 。

以下为 使用带有Laplace平滑的多项朴素贝叶斯进行文本分类的一个例子:

如下所示:已知在训练集中有两个文本及其标记,下面进行多项朴素贝叶斯模型预测第三个文本的标记。

index     X                        Y  1       Yes,I like it.          1  2       No,I dislike it.        0  3       No,No.dislike it.       ?

若使用词袋法,且 以 训练集中的文本 为词汇表,即将训练集中的文本中出现的单词都统计出来作为词典,那么记单词的数目为 n,这代表了文本的n个维度。通过统计,可得 n = 6 。

以上三个文本在这 6 个特征维度上的表示为:

    Yes  No  I  like  dislike  it X1   1   0   1    1      0     1X2   0   1   1    0      1     1 X3   0   2   0    0      1     1

下面需要计算:这里写图片描述

多项分布朴素贝叶斯是以文本的单词为粒度进行计算的,因此通过训练集的学习可有:

P(Y=1) = 4/8 = 1/2 、 P(Y=0) = 4/8 = 1/2

由Laplace平滑公式计算可得:

P(No|Y=1) = (0+1)/(4+6) = 1/10P(dislike|Y=1) = (0+1)/(4+6) = 1/10P(it|Y=1) = (1+1)/(4+6) = 1/5------------------------------------P(No|Y=0) = (1+1)/(4+6) = 1/5P(dislike|Y=0) = (1+1)/(4+6) = 1/5P(it|Y=0) = (1+1)/(4+6) = 1/5

所以:可计算出X3的样本标记Y=1和Y=0的相对概率:

P(Y=1|X3) = P(Y=1)*P(No|Y=1)*P(No|Y=1)*P(dislike|Y=1)*P(it|Y=1)= 1/2*1/10*1/10*1/10*1/5 = 1/10000  ------------------------------------------P(Y=0|X3) = P(Y=0)*P(No|Y=0)*P(No|Y=0)*P(dislike|Y=0)*P(it|Y=0)    = 1/2*1/5*1/5*1/5*1/5 = 1/1250    为什么 P(Y=1|X3) + P(Y=0|X3)不等于1 ? > 因为计算时,分母P(x1,x2,...,xn)已经被省略掉.

由公式 这里写图片描述

可知,X3的类别标记应该为 Y=0 。以上即完成了对X3的类别预测。

词汇表的选择:当预测样本的文本中出现训练集文本从未出现的新词时,这时会出现特征维度的缺失,这时可以以 现成的单词词典 作为词汇表,当然这时样本的维度会提高很多。

停用词的过滤:在文本当中,可以发现一些单词进行词袋法处理后,对文本的预测来说没有太多意义,比如上述的 it 、I等一些代词。我们可以 在词汇表和预测样本中 过滤掉这些单词来简化模型的计算过程。

3. 伯努利朴素贝叶斯模型

在伯努利朴素贝叶斯模型中,每个特征的取值是布尔型,或以0和1表示,所以伯努利模型中,每个特征值为0或者1。

在文本分类中,多项分布朴素贝叶斯是以文本的单词为粒度(以特征为粒度)进行计算的,即计算该单词特征在对应的文档中出现的次数,而伯努利朴素贝叶斯是为文本为粒度(以样本为粒度)进行计算的,即计算 存在该单词特征的文档个数。因此伯努利朴素贝叶斯模型在一定程度上忽略了同一个文档中的单词的 词频

其中 带有平滑的 这里写图片描述 的计算如下:

这里写图片描述 .

其中 这里写图片描述 为 每一个 类别为 这里写图片描述 的样本的所有特征的特征值的总和。

其中 这里写图片描述 为 在类别为 这里写图片描述 的样本集中,第 i 个特征的值不为0的样本个数。

同样地: n 为训练集样本特征的维度,这里写图片描述 为平滑系数 。

这里写图片描述 = 类别为这里写图片描述的样本的个数 / 训练集所有样本的个数。

同样,以 使用带有Laplace平滑的伯努利朴素贝叶斯进行文本分类 为例:

如下所示:已知在训练集中有三个文本及其标记,下面进行伯努利朴素贝叶斯模型预测第四个文本的标记。

index     X                        Y  1       Yes,Yes,I like it.       1  2       No,No,I dislike it.      0  3       No,No.Dislike            0   4       No.dislike it.           ?

若使用词袋法,且 以 训练集中的文本 为词汇表,即将训练集中的文本中出现的单词都统计出来作为词典,那么记单词的数目为 n,这代表了文本的n个维度。通过统计,可得 n = 6 。

以上四个文本在伯努利贝叶斯模型的这 6 个特征维度上的表示为(特征值为1或0):

    Yes  No  I  like  dislike  it X1   1   0   1    1      0     1X2   0   1   1    0      1     1 X3   0   1   0    0      1     0X4   0   1   0    0      1     1

下面需要计算:这里写图片描述

伯努利分布朴素贝叶斯是以文本为粒度进行计算的,因此通过训练集的学习可有:

P(Y=1) = 1/3 、 P(Y=0) = 2/3

由Laplace平滑公式计算可得:

P(No|Y=1) = (0+1)/(4+6) = 1/10P(dislike|Y=1) = (0+1)/(4+6) = 1/10P(it|Y=1) = (1+1)/(4+6) = 1/5------------------------------------P(No|Y=0) = (2+1)/(6+6) = 1/4P(dislike|Y=0) = (2+1)/(6+6) = 1/4P(it|Y=0) = (1+1)/(6+6) = 1/6

所以:可计算出X4的样本标记Y=1和Y=0的相对概率:

P(Y=1|X4) = P(Y=1)*P(No|Y=1)*P(dislike|Y=1)*P(it|Y=1)= 1/3*1/10*1/10*1/5 = 1/1500  ------------------------------------------P(Y=0|X4) = P(Y=0)*P(No|Y=0)*P(dislike|Y=0)*P(it|Y=0)    = 2/3*1/4*1/4*1/6 = 1/144 

由公式 这里写图片描述

可知,X4的类别标记应该为 Y=0 。以上即完成了对X4的类别预测。

三、词袋法的特征值计算

词袋法对文本特征抽取:不考虑单词出现的顺序,只将每个出现过的单词视作一列特征,称这些不重复的词汇集合为词汇表。因此每一条训练集的文本都可以映射成一个特征向量。文本的特征值的常见计算方式有以下两种:

1. TF计算

TF计算(词频计算):对于每一个样本文本,只考虑每个单词在当前这条文本中出现的频率(Term Frequency),为避免词频之间差距较大,使用归一化后的词频,通常用在多项分布朴素贝叶斯模型中。具体的公式如下:

这里写图片描述 .

其中 这里写图片描述 为 单词A 在当前文本中出现的次数;N 为 当前文本的单词个数。

例如:

    index     X                            1         Yes,Yes,I like it.           2         No,No,I dislike it.      

通过词频的计算和倍数乘积可得到向量:

    Yes  No  I  like  dislike  it X1   2   0   1    1      0     1X2   0   2   1    0      1     1 

2. TF-IDF计算

TF-IDF计算:除了计算某一个单词在当前文本中出现的频率(TF),而且还考虑 含有这个单词的文本条数 的倒数(Inverse Document Frequency),通常用在 多项分布朴素贝叶斯模型 中。当一个单词几乎在所有文本中都出现时,这个单词会对我们的分类决策带有干扰。TF-IDF的计算具体如下:

这里写图片描述

其中 这里写图片描述 、N 的含义同上;D 表示 所有的文本数目,可理解为所有的样本数;这里写图片描述 表示 包含单词A的文本数目。

为了考虑 这里写图片描述 项为0情况,在分母进行了加 1 操作。

这里写图片描述 越大,对应的特征值 这里写图片描述 就越小,对分类决策的影响就越小。

3. 二值计算

二值计算:直接使用二值特征来表示:若单词出现在文本中则特征值为1,不出现则特征值为0,通常用在伯努利朴素贝叶斯模型
中。

四、代码示例

在去掉停用词的情况下,使用TF计算、TF-IDF计算进行多项式朴素贝叶斯模型的学习,对20类新闻文本数据分类;使用高斯朴素贝叶斯模型进行花的分类。

from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset="all") # 下载近2万条文本
print news.target_names # 文本的20种类别
['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(news.data,news.target,test_size=1/4.,random_state=38)
from sklearn.feature_extraction.text import CountVectorizer
# 过滤停用词count_vec = CountVectorizer(analyzer='word',stop_words='english') 
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer(analyzer='word',stop_words='english')
# 进行TF特征抽取X_count_train = count_vec.fit_transform(X_train) X_count_test = count_vec.transform(X_test)
# 进行TF-IDF特征抽取X_tfidf_train = tfidf_vec.fit_transform(X_train) X_tfidf_test = tfidf_vec.transform(X_test)
# 使用多项分布朴素贝叶斯from sklearn.naive_bayes import MultinomialNB 
# alpha :平滑因子mnb_count_clf = MultinomialNB(alpha=1.) 
mnb_count_clf.fit(X_count_train,y_train)mnb_count_clf.score(X_count_test,y_test)
0.86311544991511036
# alpha :平滑因子mnb_tfidf_clf = MultinomialNB(alpha=1.)  
mnb_tfidf_clf.fit(X_tfidf_train,y_train)mnb_tfidf_clf.score(X_tfidf_test,y_test)
0.86884550084889645
# 使用伯努利朴素贝叶斯from sklearn.naive_bayes import BernoulliNB 
bnb_count_clf = BernoulliNB(alpha=1.)
bnb_count_clf.fit(X_count_train,y_train)bnb_count_clf.score(X_count_test,y_test)
0.72325976230899836
bnb_tfidf_clf = BernoulliNB(alpha=1.)
bnb_tfidf_clf.fit(X_tfidf_train,y_train)bnb_tfidf_clf.score(X_tfidf_test,y_test)
0.72325976230899836

> 可以发现伯努利朴素贝叶斯模型的学习中特征值只有 非0和0 的区别

from sklearn.naive_bayes import GaussianNB # 使用高斯朴素贝叶斯模型进行花的分类
from sklearn.datasets import load_irisiris = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=1/4.,random_state=38)
from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler();
X_train = standard_scaler.fit_transform(X_train)X_test = standard_scaler.transform(X_test)
gnb_clf = GaussianNB()
gnb_clf.fit(X_train,y_train)gnb_clf.score(X_test,y_test)
1.0
0 0