第5章〓朴素贝叶斯分类器 本章目标  理解极大似然估计;  理解并掌握朴素贝叶斯分类;  了解拉普拉斯平滑;  了解朴素贝叶斯分类器和极大似然估计之间的联系;  实现简单的朴素贝叶斯分类器完成垃圾信息分类问题。 朴素贝叶斯分类器是一种有监督的统计学过滤器,在垃圾邮件过滤、信息检索等领域十分常用。通过本章的介绍,读者将会了解朴素贝叶斯分类器因何得名、其与贝叶斯公式的联系,以及其与极大似然估计的关系。 5.1极大似然估计 对于工厂生产的某一批灯泡,质检部门希望检测其合格率。设m表示产品总数,随机变量Xi∈{0,1}表示编号为i的产品是否合格。由于这些产品都是同一批生产的,不妨假设: X1,X2,…,Xm~i.i.d.Bern(p)(51) 其中,p表示产品合格的概率,也就是质检部门希望得到的数据。根据经典概率模型有 p≈1m∑mi=1Xi(52) 但是式(52)为什么成立?这就需要使用极大似然估计来证明了。 极大似然估计的思想是: 找到这样一个参数p,它使所有随机变量的联合概率最大。例中,联合概率表示为 P(X1=x1,X2=x2,…,Xm=xm)=∏mi=1P(Xi=xi)=∏mi=1pxi(1-p)1-xi(53) 最大化联合概率等价于求 p*=argmaxp log∏mi=1pxi(1-p)1-xi =argmaxp∑mi=1xilogp+(1-xi)log(1-p) =argmaxp mlog(1-p)+logp1-p∑mi=1xi(54) 根据微积分知识容易证明式(52): p*=1m∑mi=1Xi(55) 形式化地说,已知整体的概率分布模型f(x;θ),但是模型的参数θ未知时,可以使用极大似然估计来估计θ的值。这里的概率分布模型既可以是连续的(概率密度函数)也可以是离散的(概率质量函数)。假设在一次随机实验中,我们独立同分布地抽到了m个样本x1,x2,…,xm组成的样本集合。似然函数,也就是联合概率分布: L(θ)=fm(x1,x2,…,xm;θ)=∏mi=1f(xi;θ)(56) 表示当前样本集合出现的可能性。令似然函数L(θ)对参数θ的导数为0,可以得到θ的最优解。但是运算中涉及乘法运算及乘法的求导等,往往计算上存在不便性。而对似然函数取对数并不影响似然函数的单调性,即 L(θ1)>L(θ2)logL(θ1)>logL(θ2)(57) 所以最大化对数似然函数: l(θ)=logL(θ)=log∏mi=1p(xi;θ)=∑mi=1logp(xi;θ)(58) 可以在保证最优解与似然函数相同的条件下,大大减少计算量。 极大似然估计通过求解参数θ使得fN(x1,x2,…,xN;θ)最大,这是一种很朴素的思想: 既然从总体中随机抽样得到了当前样本集合,那么当前样本集合出现的可能性极大。 5.2朴素贝叶斯分类 在概率论中,贝叶斯公式的描述如下: P(Yi|X)=P(X,Yi)P(X)=P(Yi)P(X|Yi)∑Kj=1P(Yj)P(X|Yj)(59) 其中Y1,Y2,…,YK为一个完备事件组,P(Yi)称为先验概率,P(Yi|X)称为后验概率。设X=(X1,X2,…,Xn)表示n维(离散)样本特征,Y∈{c1,c2,…,cK}表示样本类别。由于一个样本只能属于这K个类别中的一个,所以Y1,Y2,…,YK一定是完备的。 给定样本集合D={(x1,y1),(x2,y2),…,(xm,ym)},我们希望估计PY|X。根据贝叶斯公式,对于任意样本x=(x1,x2,…,xn),其标签为ck的概率为 P(Y=ck|X=x)=P(Y=ck)P(X=x|Y=ck)P(X=x)(510) 假设随机变量X1,X2,…,Xn相互独立,则有 P(X=x|Y=ck)=P(X1=x1,X2=x2,…,Xn=xn|Y=ck) =∏ni=1P(Xi=xi|Y=ck)(511) 代入式(510) 得 P(Y=ck|X=x)=P(Y=ck)∏ni=1P(Xi=xi|Y=ck)P(X=x)(512) 在实际进行分类任务时,不需要计算出PY|X的精确值,只需要求出k*即可。 k*=argmaxkP(Y=ck|X=x)(513) 不难看出,式(512) 右侧的分母部分与k无关。因此 k*=argmaxkP(Y=ck)∏ni=1P(Xi=xi|Y=ck)(514) 式中所有项都可以用频率代替概率在样本集合上进行估计: P(Y=ck)≈Nkm P(Xi=xi|Y=ck)≈∑mj=1I{xij=xi,yj=ck}Nk(515) 其中,Nk表示D中标签为ck的样本数量。 5.3拉普拉斯平滑 当样本集合不够大时,可能无法覆盖特征的所有可能取值。也就是说,可能存在某个ck和xi使 P(Xi=xi|Y=ck)=0(516) 此时,无论其他特征分量的取值为何,都一定有 P(Y=ck)∏ni=1P(Xi=xi|Y=ck)=0(517) 为了避免这样的问题,实际应用中常采用平滑处理。典型的平滑处理就是拉普拉斯平滑: P(Y=ck)≈Nk+1m+K P(Xi=xi|Y=ck)≈∑mj=1I{xij=xi,yj=ck}+1Nk+Ai(518) 其中,Ai表示Xi的所有可能取值的个数。 基于上述讨论,完整的朴素贝叶斯分类器的算法描述见算法51。 算法51朴素贝叶斯分类器 输入: 样本集合D={(x1,y1),(x2,y2),…,(xm,ym)}; 待预测样本x; 样本标记的所有可能取值{c1,c2,…,cK}; 样本输入变量X的每个属性变量Xi的所有可能取值{ai1,ai2,…,aiAi} 输出: 待预测样本x所属的类别 1. 计算标记为ck的样本出现的概率 P(Y=ck)=Nk+1m+K,k=1,2,…,K 2. 计算标记为ck的样本,其Xi分量的属性值为aip的概率 P(Xi=aip|Y=ck)=∑Nkj=1I(xij=aip,yj=ck)+1Nk+Ai 3. 根据上面的估计值计算x属于所有yk的概率值,并选择概率最大的作为输出 y=argmaxk=1,2,…,KP(Y=ck|X=x) =argmaxk=1,2,…,KP(Y=ck)∏ni=1P(Xi=xi|Y=ck) Return y 5.4朴素贝叶斯分类器的极大似然估计解释 朴素贝叶斯思想的本质是极大似然估计,P(Y=ck)和P(Xi=xi|Y=ck)是我们要估计的概率值。以P(Y=ck)为例,令θk=P(Y=ck),则似然函数为 L(θ)=∏mi=1P(Y=yi)=∏Kk=1θNkk(519) 根据极大似然估计,求θ等价于求解下面的优化问题: maxθl(θ)=∑Kk=1Nklnθk s.t.∑Kk=1θk=1(520) 使用拉格朗日乘子法求解。首先构造拉格朗日乘数为 Lag(θ)=∑Kk=1Nklnθk+λ∑Kk=1θk-1(521) 令拉格朗日函数对θk的偏导为0,有 Lag(θ)θk=Nkθk+λ=0Nk=-λθk(522) 于是 ∑Kk=1Nk=-λ∑Kk=1θk=-λ(523) 解得 λ=-m θk=Nkλ=Nkm(524) 这样便得到了P(Y=ck)的极大似然估计。对P(Xi=xi|Y=ck)的极大似然估计求解过程类似,留给读者自行推导。 5.5实例: 基于朴素贝叶斯实现垃圾短信分类 本节以一个例子来阐述朴素贝叶斯分类器在垃圾短信分类中的应用。SMS Spam Collection Data Set是一个垃圾短信分类数据集,包含了5574条短信,其中有747条垃圾短信。数据集以纯文本的形式存储,其中每行对应一条短信。每行的第一个单词是spam或ham,表示该行的短信是否为垃圾短信。随后记录了短信的内容,内容和标签之间以制表符分隔。 该数据集没有收录进sklearn.datasets,所以需要自行加载,如代码清单51 所示。 代码清单5 1加载SMS垃圾短信数据集 with open('./SMSSpamCollection.txt', 'r', encoding='utf8') as f: sms= [line.split('\t') for line in f] y, x = zip(*sms) 加载完成后,x和y分别是长为5574的字符串列表。其中y的每个元素只可能是spam或ham,分别表示垃圾短信和正常短信。x的每个元素表示对应短信的内容。在训练贝叶斯分类器前,需要先将x和y转换成适于训练的数值表示形式,这个过程称为特征提取,如代码清单52 所示。 代码清单5 2SMS垃圾短信数据集特征提取 from sklearn.feature_extraction.text import CountVectorizer as CV from sklearn.model_selection import train_test_split y= [label == 'spam' for label in y] x_train, x_test, y_train, y_test = train_test_split(x, y) counter= CV(token_pattern='[a-zA-Z]{2,}') x_train= counter.fit_transform(x_train) x_test= counter.transform(x_test) 特征提取的结果存储在(x_train, y_train)以及(x_test, y_test)中。其中x_train和x_test分别是4180×6595和1394×6595的稀疏矩阵。不难看出,两个矩阵的行数之和等于5574,也就是完整数据集的大小。因此两个矩阵的每行应该代表一个样例,那么每列代表什么呢?查看counter的vocabulary_属性就会发现,其大小恰好是6595,也就是所有短信中出现过的不同单词的个数。例如短信“Go until jurong point, go”中一共有5个单词,但是由于go出现了两次,所以不同单词的个数只有4个。x_train和x_test中的第i,j个元素就表示第j个单词在第i条短信中出现的次数。 最后就是朴素贝叶斯分类器的构造与训练,如代码清单53 所示。我们首先基于训练集训练朴素贝叶斯分类器,然后分别在训练集和测试集上进行测试。测试结果显示,模型在训练集上的分类准确率达到0.993,在测试集上的分类准确率为0.986。可见朴素贝叶斯分类器达到了良好的分类效果。 代码清单5 3朴素贝叶斯分类器的构造与训练 from sklearn.naive_bayes import MultinomialNB as NB model= NB() model.fit(x_train, y_train) train_score= model.score(x_train, y_train) test_score= model.score(x_test, y_test) print("train score:", train_score) print("test score:", test_score) 朴素贝叶斯分类器假设样本特征之间相互独立。这一假设非常强,以至于几乎不可能满足。但是在实际应用中,朴素贝叶斯分类器往往表现良好,特别是在垃圾邮件过滤、信息检索等场景下往往表现优异。 题库 习题5 一、 选择题 1. 朴素贝叶斯分类器的训练过程是基于训练集D来估计()。 A. 先验概率 B. 后验概率 C. 概率分布函数 D. 概率密度函数 2. 下列哪种情况不能用朴素贝叶斯分类器?() A. 训练数据集较大 B. 实例具有几个属性 C. 给定分类参数,描述实例的属性应该是条件独立的 D. 要求有较高的分类精度 3. 贝叶斯分类器的训练中,最大似然法估计参数的过程包括()。 A. 求导数,令偏导数为0,得到似然方程组 B. 对似然函数取对数,并整理 C. 解似然方程组,得到所有参数即为所求 D. 以上所有 4. 朴素贝叶斯是一种特殊的Bayes分类器,特征变量是X,类别标签是Y,它的一个假定是()。 A. 各类别的先验概率P(Y)是相等的 B. 特征变量X的各个维度是类别条件独立随机变量 C. 以0为均值,sqrt(2)/2为标准差的正态分布 D. P(X|Y)是高斯分布 5. 表51中列出了14个日期中天气、温度、湿度和风力四个因素和小明是否攀岩的关系。基于这14个观测数据,采用朴素贝叶斯分类方法计算出实例 <天气=晴天,温度=凉爽,湿度=高,风力=强>时“休息”的概率为()。 表51观测数据 日期天气温度湿度风力攀岩 D1晴天热高弱休息 D2晴天热高强休息 D3阴天热高弱攀岩 D4下雨温和高弱攀岩 D5下雨凉爽正常弱攀岩 D6下雨凉爽正常强休息 D7阴天凉爽正常强攀岩 D8晴天温和高弱休息 D9晴天凉爽正常弱攀岩 D10下雨温和正常弱攀岩 D11晴天温和正常强攀岩 D12阴天温和高强攀岩 D13阴天热正常弱攀岩 D14下雨温和高强休息 A. 0.0795 B. 0.0205 C. 0.64 D. 0.33 二、 判断题 1. 贝叶斯的思想是“由因推果”。() 2. 可以用极大似然估计法解贝叶斯分类器。() 3. 贝叶斯分类器可以解决无监督学习的问题。() 4. 朴素贝叶斯分类器不存在数据平滑问题。() 5. 贝叶斯分类器是一种基于贝叶斯公式的分类器。() 三、 填空题 1. 朴素贝叶斯分类算法假设属性之间相互。 2. 贝叶斯分类器可以解决学习的问题。 3. 贝叶斯分类器是基于概率,推导出概率。 4. 假定某同学使用贝叶斯分类模型时,由于失误操作,致使训练数据中两个维度重复表示,那么模型效果精度会。 5. 贝叶斯定理中,如果描述随机事件A和B的条件概率的定理,表达式是。 四、 问答题 1. 简述朴素贝叶斯的优缺点。 2. 简述朴素贝叶斯与LR的区别。 3. 简述朴素贝叶斯基本原理和预测过程。 4. 朴素贝叶斯中有没有超参数可以调? 五、 应用题 1. 已知样本的属性和标签如表52所示,当某样本属性为(a2, b2, c2)时,采用朴素贝叶斯方法,求非归一化的P(L3|a2,b2,c2)P(L3|a2,b2,c2)值。 表52样本的属性和标签 属性1 属性2 属性3 标签 a2 b1 c3 L2 a1 b1 c2 L3 a1 b1 c1 L1 a3 b3 c1 L3 a1 b3 c2 L3 a3 b1 c3 L1 a2 b2 c1 L3 a1 b2 c1 L3 a2 b3 c3 L3 a2 b2 c3 L1 2. 通过sklearn.datasets生成两种类别数据,使用朴素贝叶斯进行分类并展示结果。 3. 通过数据集(https://www.kaggle.com/c/sfcrime/data)对旧金山犯罪进行分类预测。