机器学习经典算法之贝叶斯分类推导

1. Bayesian decision theory

对分类任务来说,在所有相关的概率已知的情况下,贝叶斯决策论会考虑概率和误判损失来选择最优的类别标记

对情感分析来说,假设有N种情感,记为 C={c1,c2...,cN} ,又记 λij 为将真实为 cj 的样本 x 分类成 ci 产生的损失
P(cix) 为将样本分类为为 ci expected loss , 即为在此样本上产生的 conditional risk:

R(cix)=j=1NλijP(cjx)

使得 risk 最小,即寻找 Bayes optimal classifier :
f(x)=argminR(c|x) ,cC

此时对应的总体风险为 R(h) , 称为 Bayes risk 1R(h) 反映了该分类器的最好 performance, 是该机器学习算法精度的理论上限。
对应最简单的一种情况:
λ={01i = ji != j

R(cx)=1P(cx) , 最优的分类器:
f(x)=argmaxP(c|x) ,cC

所以,要获得最优分类器,首先要获得 后验概率(posterior probability) P(cx) ,通过著名的 贝叶斯公式 :

P(cx)=P(xc)P(c)P(x)

P(c) 被称为先验概率(prior probability), 在情感分析中,具体代表某类情感出现的概率,根据大数定律,样本集足够大时,可通过统计频率来进行估计。
P(x) 只是用来归一化的证据(evidence) ,显然可以从样本中 x 所占频率得出。
P(xc) 是样本 x 相对于类别 c 的类条件概率(class-conditional probabilty) ,也称为似然(likelihood)
真正的难点来了!一个样本 x 往往会包含多种属性(一句话通常会抽象为多个特征组成的向量), P(xc) 牵涉到 x 的所有属性的联合概率。假设样本有 n 个属性,就算样本每个属性都是二值性,样本空间中也会包含2n种,这可是指数级的! 一般会远大于样本集数量 m ,所以如果要通过频率去估计,显然是错误的,因为未出现的样本我们没有考虑进去,而它们概率很多时候都不为0

2.Maximun Likelihood Estimation

概率模型的训练过程就是参数估计(parameter estimation)的过程, 而关于参数估计,统计学界的两个学派争执不休:MLE属于频率主义学派(Frequentist),他们认为参数虽然未知,但却是客观存在的固定值,通过不断优化似然函数可得到这个值。而贝叶斯学派(Bayesian)认为参数是未观察到的随机变量,本身可有分布。假定参数服从一个先验分布,后基于观测到的数据来计算参数的后验分布

MLE绝对属于根据数据样本估计概率分布的经典方法:
  令 Dc 表示训练集 D 中第 c 类样本集合, 假设样本是独立同分布的(所以数据集的分布很重要 !!),则我们可以估计一个参数 θc ,对于数据集 Dc 的似然:

P(Dcθc)=xDcP(xθc)

我们要做的,就是寻找一个 θ 使得上面的 P(Dcθc) , 也就是使这个数据集出现的概率最大。
因为概率连乘在计算机中容易造成下溢,所以通常使用 对数似然(log-likelihood)

LL(θc)==log P(Dc|θc)xDclogP(xθc)

θ 的极大似然估计 θ^c

θ^c=arg max(LL(θc))

一种偷懒的做法:如果样本属性连续,假设概率密度函数 p(x)N(μc,σ2c) , 可得出 μc σc 的极大似然估计 :
μ^c=1|Dc|xDcx

σ^2=1|Dc|xDc(xμ^c)(xμ^c)T

其中 |Dc| 代表数据集 Dc 的样本数
这种方法的痛点在于要求数据的概率分布是根据直觉猜出来的,是否符合真实数据的分布无法得知, 所以也许会产生误导性结果

3. naive Bayes Classifier

可以看出,贝叶斯的扩展式实际是这样的:

P(C|F1F2Fn)=P(C)P(F1F2FnC)P(F1F2Fn)=P(C)P(F1C)P(F2FnCF1)P(F1F2Fn)==P(C)P(F1C)P(F2CF1)P(FnCF1F2Fn1)P(F1F2Fn)

其中 Fi 是样本x的属性,其实等于 xi ,这里用F是为了让大家更直观体会到它是 “Feature”。而每一个 P(FiFnCF1Fi1) 都是一个似然!

为了简化复杂的计算,朴素贝叶斯假设样本的各个属性间都是独立的,这样复杂的式子变得”清新”不少:

P(C|F1F2Fn)=P(C)P(F1F2FnC)P(F1F2Fn)=P(C)P(F1C)P(F2C)P(FnC)P(F1F2Fn)

P(cx)=P(c)P(x)i=1nP(xic)

所以朴素贝叶斯分类器:
hnb(x)=arg maxP(c)i=1nP(xic)  ,cC

要计算出这个表达式, P(c)=|Dc|D ,如果 x 的属性都是离散属性,那么
P(xic)=Dc,xi|Dc|

如果 xi 是连续属性,那么考虑概率密度函数, 假定 p(xic)N(μc,σ2c,i) , 其中 μc σ2c,i 是样本属性i在第c类上的均值和方差,则有
p(xic)=12πσc,iexp(xiμc,i)22σ2c,i

不过这里存在一个严重的问题,如果测试时一个属性的值在训练集从未出现过,这样计算出来的 P(xic) 就为0,连乘之后,导致 ni=1P(xic) 整个为0!!
我们显然不希望这样,它代表完全忽略新属性值出现的可能性,这样的学习器就好像一个书呆子只会做书本上的题一样连一点悟性都没有,所以,在估计概率值时通常会进行 “平滑(smoothing)” ,常用的是 拉普拉斯修正(Laplacian correction)
P^(c)=|Dc| + 1|D| + N

P^(xic)=Dc,xi + 1|Dc| + Ni

其中 N 代表训练集D中可能的类别数, Ni 表示第i个属性可能的取值数。分母加了 Ni 是很好玩的,最理想的情况它将使互斥事件的概率改变后相加还是1。当然 N Ni都是我们自己设定的参数。这时就需要对这个数据集本身有所理解了。
关于使用贝叶斯分类其实有多种trick,比如采用懒惰学习(lazy learning) ,接收到预测请求时再根据当前数据集训练;采用储存概率表,可在计算时进行查表 ,对提速很有用; 数据增加时,对新样本的属性牵涉的概率进行计数修正可实现增量学习(Incremental learning)

总结一下使用朴素贝叶斯分类器的情况吧,需要我们选择的地方:假设这个连续属性的分布是正态分布还是其它的分布如伯努利分布等,第二就是对平滑的选择方法,大多时候使用拉普拉斯平滑(据说是他在看日出的时候通过想明天太阳是否升起想出来的) ,当然还有其它的平滑方案如Lidstone平滑(通过增加一个大于0的可调参数 α ),然后是选择平滑的参数。所以,目前的我感觉无论是什么学习算法,最终都会来到这一步:对数据集本身的理解

4.Sentiment classification in action

深刻理解一个学习算法,除了推出公式外,当然还要进行实战啊,下面是我用python写的demo。
数据来源是康奈尔大学网站的2M影评数据集,可在http://download.csdn.net/detail/lsldd/9346233 进行下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值