机器学习之朴素贝叶斯模型及代码示例
来源:互联网 发布:武汉大学网络教育平台 编辑:程序博客网 时间: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
- 机器学习之朴素贝叶斯模型及代码示例
- 朴素贝叶斯算法学习及代码示例
- 机器学习_统计模型之(三)朴素贝叶斯
- 机器学习之朴素贝叶斯
- 机器学习之朴素贝叶斯
- 机器学习之朴素贝叶斯
- 机器学习之朴素贝叶斯分类器附C++代码
- 机器学习之-朴素贝叶斯-具体怎么实现及应用
- 机器学习-朴素贝叶斯分类代码详解
- 机器学习实战笔记(3.2)-朴素贝叶斯算法(贝努力模型代码实现)
- 机器学习之决策树和随机森林及代码示例
- 机器学习之支持向量机SVM及代码示例
- 机器学习之划分聚类及代码示例
- 机器学习之层次聚类及代码示例
- 机器学习之密度聚类及代码示例
- 机器学习之主成分分析PCA及代码示例
- 机器学习实战之朴素贝叶斯
- 机器学习练习之朴素贝叶斯
- 转接口IC GM8914:FPD-LINK III转LVTTL芯片 DC 平衡双向控制解串器
- 修改文件夹名称和文件名
- Java数据类型
- Java学习之封装与this关键字
- 2017年UESTC第十五届校赛总结
- 机器学习之朴素贝叶斯模型及代码示例
- 爬楼梯
- Java学习-基础(7)
- Linux系统调用列表
- Oracle数据库名、实例名、全局数据库名、服务名、网络服务名区别和联系
- 算法导论斐波那契堆
- Oracle Time Model Statistics(时间模型统计)
- php中\r \r\n \t的区别
- ios学习第一天(七)对象之块