一、贝叶斯方法
1、含义
P
(
A
∣
B
)
=
P
(
A
,
B
)
P
(
A
)
=
P
(
B
∣
A
)
P
(
A
)
\displaystyle P( A|B) \ =\ \frac{P( A,B)}{P( A)} =\frac{P( B|A)}{P( A)}
P(A∣B) = P(A)P(A,B)=P(A)P(B∣A)
其中
P
(
A
)
P(A)
P(A)是先验概率,
P
(
B
∣
A
)
P( B|A)
P(B∣A)是后验概率,
P
(
A
,
B
)
P( A,B)
P(A,B)是联合概率。在机器学习中,最简单的二分类问题可以表示为
P
(
"
属
于
某
类
"
∣
"
具
有
某
种
特
征
"
)
P("属于某类"|"具有某种特征")
P("属于某类"∣"具有某种特征")的概率是否大于
1
2
\displaystyle \frac{1}{2}
21。
2、优点:
(1)运行速度快。对于文本分类任务,预测就是分词后进行概率乘积,如取log则直接做加法更快。
(2)在分布独立这个假设成立的情况下,相对于LR需要的样本量也更少一点。
(3)对于类别类的输入特征变量,效果非常好。对于数值型变量特征,默认符合正态分布的。
3、缺点:
(1)如果测试集某个类别变量特征,在训练集里未出现,则后验概率为0,导致预测结果失效。可以对其进行平滑处理,进行缓解。
(2)朴素贝叶斯算出的概率结果,仅适合比较大小,无法体现实际物理含义
(3)朴素贝叶斯有分布独立的假设前提,而实际中是很难完全独立的。
二、垃圾邮件识别
假正常邮件和垃圾邮件个1万作为训练集。需要判断以下邮件是否是垃圾邮件。即判断"P( “垃圾邮件”|“我司可办理正规发票(保真)17%”)是否大于
1
2
\displaystyle \frac{1}{2}
21"。
1、在样本量足够多,满足大数定理:
P
(
“
垃
圾
邮
件
”
∣
“
我
司
可
办
理
正
规
发
票
(
保
真
)
17
%
增
值
税
发
票
点
数
优
惠
!
”
)
=
垃
圾
邮
件
中
出
现
这
句
话
的
次
数
垃
圾
邮
件
中
出
现
这
句
话
的
次
数
+
正
常
邮
件
中
出
现
这
句
话
的
次
数
\displaystyle P( “垃圾邮件”|“我司可办理正规发票(保真)17\%增值税发票点数优惠!”) =\frac{垃圾邮件中出现这句话的次数}{垃圾邮件中出现这句话的次数+正常邮件中出现这句话的次数} \
P(“垃圾邮件”∣“我司可办理正规发票(保真)17%增值税发票点数优惠!”)=垃圾邮件中出现这句话的次数+正常邮件中出现这句话的次数垃圾邮件中出现这句话的次数
训练集是有限的,而句子的可能性则是无限的(无法满足大数定理)。所以覆盖所有句子可能性的训练集是不存在的。但汉子常用字2500个,常用词语56000个。所以可以不拿句子作为特征,而使用句子里的词语(组合)作为特征。
2、分词后结果
P
(
“
垃
圾
邮
件
”
∣
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
“
)
=
P
(
(
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
”
)
∣
"
垃
圾
邮
件
"
)
P
(
“
垃
圾
邮
件
”
)
P
(
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
”
)
\displaystyle P(\ “垃圾邮件”|“我”,“司”,“可”,“办理”,“正规发票”,“保真“) =\frac{P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”)\mid"垃圾邮件")P(“垃圾邮件”)}{P(“我”,“司”,“可”,“办理”,“正规发票”,“保真”)}
P( “垃圾邮件”∣“我”,“司”,“可”,“办理”,“正规发票”,“保真“)=P(“我”,“司”,“可”,“办理”,“正规发票”,“保真”)P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”)∣"垃圾邮件")P(“垃圾邮件”)
3、条件独立假设
贝叶斯公式 + 条件独立假设 = 朴素贝叶斯方法
注:“垃圾邮件”:S,“正常邮件”:H
P
(
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
”
)
∣
S
)
=
P
(
“
我
”
∣
S
)
×
P
(
“
司
”
∣
S
)
×
P
(
“
可
”
∣
S
)
×
P
(
“
办
理
”
∣
S
)
×
P
(
“
正
规
发
票
”
∣
S
)
×
P
(
“
保
真
”
∣
S
)
×
P
(
“
增
值
税
”
∣
S
)
\displaystyle P( “我”,“司”,“可”,“办理”,“正规发票”,“保真”) |S) =P( “我”|S) \times P( “司”|S) \times P( “可”|S) \times P( “办理”|S) \times P( “正规发票”|S) \times P( “保真”|S) \times P( “增值税”|S)
P(“我”,“司”,“可”,“办理”,“正规发票”,“保真”)∣S)=P(“我”∣S)×P(“司”∣S)×P(“可”∣S)×P(“办理”∣S)×P(“正规发票”∣S)×P(“保真”∣S)×P(“增值税”∣S)
4、处理后式子中的每一项都特别好求。只需要分别统计各类邮件中该关键词出现的概率
P
(
“
发
票
”
∣
S
)
=
垃
圾
邮
件
中
所
以
“
发
票
”
的
次
数
垃
圾
邮
件
中
所
有
词
语
的
次
数
\displaystyle P( “发票”|S) =\frac{垃圾邮件中所以“发票”的次数}{垃圾邮件中所有词语的次数} \
P(“发票”∣S)=垃圾邮件中所有词语的次数垃圾邮件中所以“发票”的次数
在朴素贝叶斯方法中,“”“我司可办理正规发票”与“正规发票可办理我司”完全相同。无法体现词语之间的顺序信息,所以朴素贝叶斯方法也是一种词袋模型。
三、对重复词的处理
1、多项式模型:
重复的词语我们视为其出现多次
P
(
(
“
代
开
”
,
“
发
票
”
,
“
增
值
税
”
,
“
发
票
”
,
“
正
规
”
,
“
发
票
”
)
∣
S
)
=
P
(
“
代
开
”
∣
S
)
P
(
“
发
票
”
∣
S
)
P
(
“
增
值
税
”
∣
S
)
P
(
“
发
票
”
∣
S
)
P
(
“
正
规
”
∣
S
)
P
(
“
发
票
”
∣
S
)
\displaystyle P(( “代开”,“发票”,“增值税”,“发票”,“正规”,“发票”) |S) =P( “代开”|S) P( “发票”|S) P( “增值税”|S) P( “发票”|S) P( “正规”|S) P( “发票”|S)
P((“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)∣S)=P(“代开”∣S)P(“发票”∣S)P(“增值税”∣S)P(“发票”∣S)P(“正规”∣S)P(“发票”∣S)
=
P
(
“
代
开
”
∣
S
)
P
3
(
“
发
票
”
∣
S
)
P
(
“
增
值
税
”
∣
S
)
P
(
“
正
规
”
∣
S
)
\displaystyle =P( “代开”|S) P^{3} \ ( “发票”|S) P( “增值税”|S) P( “正规”|S)
=P(“代开”∣S)P3 (“发票”∣S)P(“增值税”∣S)P(“正规”∣S)
在统计计算
P
(
“
发
票
”
∣
S
)
P(“发票”|S)
P(“发票”∣S)时,每个被统计的垃圾邮件样本中重复的词语也统计多次.
P
(
“
发
票
”
∣
S
)
=
每
封
垃
圾
邮
件
中
出
现
“
发
票
”
的
次
数
的
总
和
每
封
垃
圾
邮
件
中
所
有
词
出
现
次
数
(
计
算
重
复
次
数
)
的
总
和
\displaystyle P( “发票”|S) =\ \frac{每封垃圾邮件中出现“发票”的次数的总和}{每封垃圾邮件中所有词出现次数( 计算重复次数) 的总和} \ \
P(“发票”∣S)= 每封垃圾邮件中所有词出现次数(计算重复次数)的总和每封垃圾邮件中出现“发票”的次数的总和
2、伯努利模型:
将重复的词语都视为其只出现1次
P
(
“
发
票
”
∣
S
)
=
出
现
“
发
票
”
的
垃
圾
邮
件
的
的
封
数
每
封
垃
圾
邮
件
中
所
有
词
出
现
次
数
(
取
唯
一
值
)
的
总
和
\displaystyle P( “发票”|S) =\ \frac{出现“发票”的垃圾邮件的的封数}{每封垃圾邮件中所有词出现次数( 取唯一值) 的总和} \ \
P(“发票”∣S)= 每封垃圾邮件中所有词出现次数(取唯一值)的总和出现“发票”的垃圾邮件的的封数
3、混合模型:
在计算句子概率时,不考虑重复词语出现的次数,但是在统计计算词语的概率P(“词语”|S)时,却考虑重复词语的出现次数。
P
(
“
发
票
”
∣
S
)
=
每
封
垃
圾
邮
件
中
出
现
“
发
票
”
的
次
数
的
总
和
每
封
垃
圾
邮
件
中
所
有
词
出
现
次
数
(
取
唯
一
值
)
的
总
和
\displaystyle P( “发票”|S) =\ \frac{每封垃圾邮件中出现“发票”的次数的总和}{每封垃圾邮件中所有词出现次数( 取唯一值) 的总和} \ \
P(“发票”∣S)= 每封垃圾邮件中所有词出现次数(取唯一值)的总和每封垃圾邮件中出现“发票”的次数的总和
三者的关系图如下:
四、对停用词和关键词的处理
人工构建停用词和关键词表
五、平滑技术
如果在训练集中,没有出现“正规发票”发票,则采用平滑处理。所有的平滑技术都是给未出现在训练集中的词语一个估计的概率,而相应地调低其他已经出现的词语的概率。平滑技术是因为数据集太小而产生的现实需求。如果数据集足够大,平滑技术对结果的影响将会变小。
1、伯努利模型
P
(
“
正
规
发
票
”
∣
S
)
=
出
现
“
正
规
发
票
”
的
垃
圾
邮
件
封
数
+
1
每
封
垃
圾
邮
件
中
所
有
词
出
现
次
数
(
取
唯
一
值
)
的
总
和
+
2
\displaystyle P( “正规发票”|S) =\ \frac{出现“正规发票”的垃圾邮件封数+1}{每封垃圾邮件中所有词出现次数( 取唯一值) 的总和+2} \ \
P(“正规发票”∣S)= 每封垃圾邮件中所有词出现次数(取唯一值)的总和+2出现“正规发票”的垃圾邮件封数+1
2、多项式模型
P
(
“
正
规
发
票
”
∣
S
)
=
每
封
垃
圾
邮
件
中
出
现
“
发
票
”
的
次
数
的
总
和
每
封
垃
圾
邮
件
中
所
有
词
出
现
次
数
(
计
算
重
复
次
数
)
的
总
和
+
被
统
计
词
表
的
词
语
个
数
\displaystyle P( “正规发票”|S) =\ \frac{每封垃圾邮件中出现“发票”的次数的总和}{每封垃圾邮件中所有词出现次数( 计算重复次数) 的总和+被统计词表的词语个数} \ \
P(“正规发票”∣S)= 每封垃圾邮件中所有词出现次数(计算重复次数)的总和+被统计词表的词语个数每封垃圾邮件中出现“发票”的次数的总和
六、为什么可以使用朴素贝叶斯代替贝叶斯
核心是有些独立假设在各个分类之间的分布都是均匀的,所以对于似然的相对大小不产生影响。即便如此,也有很大的可能性各个独立假设之间产生的消极影响和积极影响互相抵消,最终导致结果收到的影响不大。
七、工程上的一些tricks
1、取对数
上文垃圾邮件识别处理后的式子中涉及很多乘法运算,计算的时间开销比较大。采用取对数log的方法(两边同时取底数为2的对数),将乘法变成加法。为避免测试阶段对数运算耗时,可以在训练阶段直接计算
l
o
g
P
log{P}
logP ,然后把他们存在一张大的hash表里。在判断的时候直接提取hash表中已经计算好的对数概率,然后相加即可。这样使得判断所需要的计算时间被转移到了训练阶段,实时运行的时候速度就比之前快得多。
C
=
P
(
“
我
”
∣
S
)
×
P
(
“
司
”
∣
S
)
×
P
(
“
可
”
∣
S
)
×
P
(
“
办
理
”
∣
S
)
×
P
(
“
正
规
发
票
”
∣
S
)
×
P
(
“
保
真
”
∣
S
)
×
P
(
“
增
值
税
”
∣
S
)
×
P
(
“
垃
圾
邮
件
”
)
\displaystyle C=P( “我”|S) \times P( “司”|S) \times P( “可”|S) \times P( “办理”|S) \times P( “正规发票”|S) \times P( “保真”|S) \times P( “增值税”|S) \times P( “垃圾邮件”) \
C=P(“我”∣S)×P(“司”∣S)×P(“可”∣S)×P(“办理”∣S)×P(“正规发票”∣S)×P(“保真”∣S)×P(“增值税”∣S)×P(“垃圾邮件”)
C ‾ = P ( “ 我 ” ∣ H ) × P ( “ 司 ” ∣ H ) × P ( “ 可 ” ∣ H ) × P ( “ 办 理 ” ∣ H ) × P ( “ 正 规 发 票 ” ∣ H ) × P ( “ 保 真 ” ∣ H ) × P ( “ 增 值 税 ” ∣ H ) × P ( “ 正 常 邮 件 ” ) \displaystyle \overline{C} =P( “我”|H) \times P( “司”|H) \times P( “可”|H) \times P( “办理”|H) \times P( “正规发票”|H) \times P( “保真”|H) \times P( “增值税”|H) \times P( “正常邮件”) \ C=P(“我”∣H)×P(“司”∣H)×P(“可”∣H)×P(“办理”∣H)×P(“正规发票”∣H)×P(“保真”∣H)×P(“增值税”∣H)×P(“正常邮件”)
l o g C = l o g P ( “ 我 ” ∣ S ) + l o g P ( “ 司 ” ∣ S ) + l o g P ( “ 可 ” ∣ S ) + l o g P ( “ 办 理 ” ∣ S ) + l o g P ( “ 正 规 发 票 ” ∣ S ) + l o g P ( “ 保 真 ” ∣ S ) + l o g P ( “ 增 值 税 ” ∣ S ) \displaystyle logC=logP( “我”\mid S) +logP( “司”\mid S) +logP( “可”\mid S) +logP( “办理”\mid S) +logP( “正规发票”\mid S) +logP( “保真”\mid S) +logP( “增值税”\mid S) logC=logP(“我”∣S)+logP(“司”∣S)+logP(“可”∣S)+logP(“办理”∣S)+logP(“正规发票”∣S)+logP(“保真”∣S)+logP(“增值税”∣S)
l o g C ‾ = l o g P ( “ 我 ” ∣ H ) + l o g P ( “ 司 ” ∣ H ) + l o g P ( “ 可 ” ∣ H ) + l o g P ( “ 办 理 ” ∣ H ) + l o g P ( “ 正 规 发 票 ” ∣ H ) + l o g P ( “ 保 真 ” ∣ H ) + l o g P ( “ 增 值 税 ” ∣ H ) \displaystyle log\overline{C} =logP( “我”\mid H) +logP( “司”\mid H) +logP( “可”\mid H) +logP( “办理”\mid H) +logP( “正规发票”\mid H) +logP( “保真”\mid H) +logP( “增值税”\mid H) logC=logP(“我”∣H)+logP(“司”∣H)+logP(“可”∣H)+logP(“办理”∣H)+logP(“正规发票”∣H)+logP(“保真”∣H)+logP(“增值税”∣H)
2、转换权重
对于二分类,可以继续提高判断的速度。既然要比较
l
o
g
C
log{C}
logC和
l
o
g
C
‾
log{\overline{C}}
logC的大小,那就可以直接将上下两式相减,并继续化简:
l
o
g
C
l
o
g
C
‾
=
l
o
g
P
(
“
我
”
∣
S
)
l
o
g
P
(
“
我
”
∣
H
)
+
l
o
g
P
(
“
司
”
∣
S
)
l
o
g
P
(
“
司
”
∣
H
)
+
l
o
g
P
(
“
可
”
∣
S
)
l
o
g
P
(
“
可
”
∣
H
)
+
l
o
g
P
(
“
办
理
”
∣
S
)
l
o
g
P
(
“
办
理
”
∣
H
)
+
l
o
g
P
(
“
正
规
发
票
”
∣
S
)
l
o
g
P
(
“
正
规
发
票
”
∣
H
)
+
l
o
g
P
(
“
保
真
”
∣
S
)
l
o
g
P
(
“
保
真
”
∣
H
)
+
l
o
g
P
(
“
增
值
税
”
∣
S
)
l
o
g
P
(
“
增
值
税
”
∣
H
)
\displaystyle \frac{log\ C}{log\overline{C}} =\frac{logP( “我”\mid S)}{logP( “我”\mid H)} +\frac{logP( “司”\mid S)}{logP( “司”\mid H)} +\frac{logP( “可”\mid S)}{logP( “可”\mid H)} +\frac{logP( “办理”\mid S)}{logP( “办理”\mid H)} +\frac{logP( “正规发票”\mid S)}{logP( “正规发票”\mid H)} +\frac{logP( “保真”\mid S)}{logP( “保真”\mid H)} +\frac{logP( “增值税”\mid S)}{logP( “增值税”\mid H)}
logClog C=logP(“我”∣H)logP(“我”∣S)+logP(“司”∣H)logP(“司”∣S)+logP(“可”∣H)logP(“可”∣S)+logP(“办理”∣H)logP(“办理”∣S)+logP(“正规发票”∣H)logP(“正规发票”∣S)+logP(“保真”∣H)logP(“保真”∣S)+logP(“增值税”∣H)logP(“增值税”∣S)
l
o
g
C
l
o
g
C
‾
\displaystyle \frac{log\ C}{log\overline{C}}
logClog C如果大于0则属于垃圾邮件。我们可以把其中每一项作为其对应词语的权重,比如
l
o
g
P
(
“
正
规
发
票
”
∣
S
)
l
o
g
P
(
“
正
规
发
票
”
∣
H
)
\displaystyle \frac{logP( “正规发票”\mid S)}{logP( “正规发票”\mid H)}
logP(“正规发票”∣H)logP(“正规发票”∣S)就可以作为词语“发票”的权重,权重越大就越说明“发票”更可能是与“垃圾邮件”相关的特征。这样可以根据权重的大小来评估和筛选显著的特征,比如关键词。而这些权重值可以直接提前计算好而存在hash表中 。判断的时候直接将权重求和即可。
关键词hash表的样子如下,左列是权重,右列是其对应的词语,权重越高的说明越“关键”:
3、选取TOPK的关键词
直接选取一段文本中权重最高的K个词语,将其权重进行加和。对于篇幅过大或者过小的邮件,如果选取权重最高的15个词进行计算,则会有判断误差。
比如这个垃圾邮件的例子:(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)。分词出了10个词语,其中有“正规发票”、“发票”2个关键词。关键词的密度还是蛮大的,应该算是敏感邮件。但因为采用最高15个词语的权重求和,并且相应的阈值是基于15个词的情况有效,可能算出来的结果还小于之前的阈值,这就造成漏判了。
类似的,如果一封税务主题的邮件有1000个词语,其中只有“正规发票”、“发票”、“避税方法”3个权重比较大的词语,它们只是在正文表述中顺带提到的内容。关键词的密度被较长的篇幅稀释了,应该算是正常邮件。但是却被阈值判断成敏感邮件,造成误判了。
解决的基本思想都是选取词语的个数及对应的阈值要与篇幅的大小成正比,本文只介绍其中一种方法:
对于长篇幅邮件,按一定的大小,比如每500字,将其分割成小的文本段落,再对小文本段落采用topk关键词的方法。只要其中有一个小文本段落超过阈值就判断整封邮件是垃圾邮件。
对于超短篇幅邮件,比如50字,可以按篇幅与标准比较篇幅的比例来选取topk,以确定应该匹配关键词语的个数。比如选取
50
500
×
15
≈
2
\frac{50}{500}×15≈2
50050×15≈2个词语进行匹配,相应的阈值可以是之前阈值的
2
15
\frac{2}{15}
152 。以此来判断则更合理。
4、位置权重
可以根据词语出现的位置,对其权重再乘以一个放大系数,以扩大其对整封邮件的影响,提高识别准确度。比如一封邮件其标题是“正规发票”(假设标题的放大系数为2),段首句是“发票”,“点数”,“优惠”(假设段首的放大系数为1.5),剩下的句子是(“我”,“司”)。则计算
l
o
g
C
l
o
g
C
‾
\displaystyle \frac{log\ C}{log\overline{C}}
logClog C 时的公式就可以调整为:
l
o
g
C
l
o
g
C
‾
=
2
×
l
o
g
P
(
“
正
规
发
票
”
∣
S
)
l
o
g
P
(
“
正
规
发
票
”
∣
H
)
+
1.5
×
l
o
g
P
(
“
发
票
”
∣
S
)
l
o
g
P
(
“
发
票
”
∣
H
)
+
1.5
×
l
o
g
P
(
“
点
数
”
∣
S
)
l
o
g
P
(
“
点
数
”
∣
H
)
+
1.5
×
l
o
g
P
(
“
优
惠
”
∣
S
)
l
o
g
P
(
“
优
惠
”
∣
H
)
+
l
o
g
P
(
“
我
”
∣
S
)
l
o
g
P
(
“
我
”
∣
H
)
+
l
o
g
P
(
“
司
”
∣
S
)
l
o
g
P
(
“
司
”
∣
H
)
\displaystyle \frac{log\ C}{log\overline{C}} =2\times \frac{logP( “正规发票”\mid S)}{logP( “正规发票”\mid H)} +1.5\times \frac{logP( “发票”\mid S)}{logP( “发票”\mid H)} +1.5\times \frac{logP( “点数”\mid S)}{logP( “点数”\mid H)} +1.5\times \frac{logP( “优惠”\mid S)}{logP( “优惠”\mid H)} +\frac{logP( “我”\mid S)}{logP( “我”\mid H)} +\frac{logP( “司”\mid S)}{logP( “司”\mid H)}
logClog C=2×logP(“正规发票”∣H)logP(“正规发票”∣S)+1.5×logP(“发票”∣H)logP(“发票”∣S)+1.5×logP(“点数”∣H)logP(“点数”∣S)+1.5×logP(“优惠”∣H)logP(“优惠”∣S)+logP(“我”∣H)logP(“我”∣S)+logP(“司”∣H)logP(“司”∣S)
5、训练预料的更新
词语及其权重会随着时间不断变化,需要时不时地用最新的样本来训练以更新词语及其权重。如随便注册一些邮箱,然后公布在各大论坛上。一个月后收到的邮件就绝大部分都是垃圾邮件了。再找一些正常的邮件,基本就能够训练了。这些用于自动搜集垃圾邮件的邮箱叫做“蜜罐”。“蜜罐”是网络安全领域常用的手段,因其原理类似诱捕昆虫的装有蜜的罐子而得名。比如杀毒软件公司会利用蜜罐来监视或获得计算机网络中的病毒样本、攻击行为等。
八、贝叶斯的思维方式
1、逆概问题
叶斯公式能够揭示两个相反方向的条件概率之间的转换关系。从贝叶斯公式的发现历史来看,其就是为了处理所谓“逆概”问题而诞生的。比如
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)不能通过直接观测来得到结果,而
P
(
X
∣
Y
)
P(X|Y)
P(X∣Y) 却容易通过直接观测得到结果,就可以通过贝叶斯公式从间接地观测对象去推断不可直接观测的对象的情况。
如,基于邮件的文本内容判断其属于垃圾邮件的概率不好求(不可通过直接观测、统计得到),但是基于已经搜集好的垃圾邮件样本,去统计(直接观测)其文本内部各个词语的概率却非常方便。引申一步,基于样本特征去判断其所属标签的概率不好求,但是基于已经搜集好的打上标签的样本(有监督),却可以直接统计属于同一标签的样本内部各个特征的概率分布。因此贝叶斯方法的理论视角适用于一切分类问题的求解。
2、多分类问题
如判断是否是垃圾邮件、个人邮件、工作他邮件的三分类问题。
现在有这3类 邮件各1万封作为样本。需要训练出一个贝叶斯分类器。这里依次用
Y
1
,
Y
2
,
Y
3
Y1,Y2,Y3
Y1,Y2,Y3 表示这三类邮件,用
X
X
X表示被判断的邮件。套用贝叶斯公式有:
P
(
Y
1
∣
X
)
=
P
(
X
)
P
(
X
∣
Y
1
)
P
(
Y
1
)
\displaystyle P( Y_{1} |X) =\ P( X) P( X|Y_{1}) P( Y_{1}) \ \
P(Y1∣X)= P(X)P(X∣Y1)P(Y1)
P ( Y 2 ∣ X ) = P ( X ) P ( X ∣ Y 2 ) P ( Y 2 ) \displaystyle P( Y_{2} |X) =\ P( X) P( X|Y_{2}) P( Y_{2}) \ \ P(Y2∣X)= P(X)P(X∣Y2)P(Y2)
P ( Y 3 ∣ X ) = P ( X ) P ( X ∣ Y 3 ) P ( Y 3 ) \displaystyle P( Y_{3} |X) =\ P( X) P( X|Y_{3}) P( Y_{3}) \ \ P(Y3∣X)= P(X)P(X∣Y3)P(Y3)
(1)似然函数
通过比较3个概率值的大小即可得到X XX所属的分类。发现三个式子的分母P(X) P(X)P(X) 一样,比较大小时可以忽略不计,于是就可以用下面这一个式子表达上面3式:
P
(
Y
i
∣
X
)
∝
P
(
X
)
P
(
X
∣
Y
i
)
;
i
=
1
,
2
,
3
\displaystyle P( Y_{i} |X) \propto\ P( X) P( X|Y_{i}) \ ;i=1,2,3
P(Yi∣X)∝ P(X)P(X∣Yi) ;i=1,2,3
其中 ∝ \propto ∝ 表示“正比于”。而 P ( X ∣ Y i ) \displaystyle P(X|Y_{i}) P(X∣Yi)则有个特别高逼格的名字叫做“似然函数”。我们上大学的时候也被这个名字搞得晕晕乎乎的,其实它也是个概率,直接理解成 P ( Y i ∣ X ) \displaystyle P( Y_{i} |X) P(Yi∣X) 的逆反条件概率”就方便了。
这里只是以垃圾邮件3分类问题举了个例子,对于任意多分类的问题都可以用这样的思路去理解。比如新闻分类、情感喜怒哀乐分类等等。
(2)最大似然函数
在垃圾邮件的例子中,先验概率都相等,
P
(
Y
1
)
=
P
(
Y
2
)
=
P
(
Y
3
)
=
10000
/
30000
=
1
/
3
P(Y_1)=P(Y_2)=P(Y_3)=10000/30000=1/3
P(Y1)=P(Y2)=P(Y3)=10000/30000=1/3,所以上面是式子又可以进一步化简:
P
(
Y
i
∣
X
)
∝
P
(
X
)
;
i
=
1
,
2
,
3
\displaystyle P( Y_{i} |X) \propto\ P( X) \ ;i=1,2,3
P(Yi∣X)∝ P(X) ;i=1,2,3
只需比较右边式子(也就是“似然函数”)的大小就可以了。这种方法就是传说中的最大似然法:不考虑先验概率而直接比较似然函数。
(3)先验概率问题
实际情况下,不同的概率分布不一定是
1
:
1
:
1
1:1:1
1:1:1,知识认为的按照
1
:
1
:
1
1:1:1
1:1:1进行抽样。真正邮箱里收到的这三类邮件的分布可能并不是这样。也就是说,在我们对于先验概率一无所知时,只能假设每种猜测的先验概率是均等的(其实这也是人类经验的结果),这个时候就只有用最大似然了。在现实运用过程中如果发现最大似然法有偏差,可以考虑对不同的似然函数设定一些系数或者阈值,使其接近真实情况。
但是,如果我们有足够的自信,训练集中这三类的样本分布的确很接近真实的情况,这时就应该用贝叶斯方法。难怪前面的贝叶斯学派强调的是“靠谱的先验概率”。所以说贝叶斯学派的适用范围更广,关键要先验概率靠谱,而频率学派有效的前提也是他们的先验概率同样是经验统计的结果。
九、朴素贝叶斯注意点:
1、很多特征是连续数值型的,不一定服从正态分布,需将数据调整为正态分布。
2、对测试数据中的0频次项,一定要记得平滑,简单一点可以用『拉普拉斯平滑』。
3、先处理处理特征,把相关特征去掉,因为高相关度的2个特征在模型中相当于发挥了2次作用。
4、朴素贝叶斯分类器一般可调参数比较少,比如scikit-learn中的朴素贝叶斯只有拉普拉斯平滑因子alpha,类别先验概率class_prior和预算数据类别先验fit_prior。模型端可做的事情不如其他模型多,因此需集中精力进行数据的预处理、特征选择。
5、其他的模型(像logistic regression,SVM等)做完之后,我们都可以尝试一下bagging和boosting等融合增强方法。咳咳,很可惜,对朴素贝叶斯里这些方法都没啥用。原因?原因是这些融合方法本质上是减少过拟合,减少variance的。朴素贝叶斯是没有variance可以减小。
十、最常见应用场景及方法
1、文本分类/垃圾文本过滤/情感判别
这大概会朴素贝叶斯应用做多的地方了,即使在现在这种分类器层出不穷的年代,在文本分类场景中,朴素贝叶斯依旧坚挺地占据着一席之地。原因嘛,大家知道的,因为多分类很简单,同时在文本数据中,分布独立这个假设基本是成立的。而垃圾文本过滤(比如垃圾邮件识别)和情感分析(微博上的褒贬情绪)用朴素贝叶斯也通常能取得很好的效果。
2、推荐系统
朴素贝叶斯和协同过滤(Collaborative Filtering)是一对好搭档,协同过滤是强相关性,但是泛化能力略弱,朴素贝叶斯和协同过滤一起,能增强推荐的覆盖度和效果。
3、Scikit-learn中的朴素贝叶斯
(1)高斯分布型
用于classification问题,假定属性/特征是服从正态分布的
(2)多项式型
用于离散值模型里。比如文本分类问题里面我们提到过,我们不光看词语是否在文本中出现,也得看出现的次数。如果总词数为n,出现词数为m的话,说起来有点像掷骰子n次出现m次这个词的场景。
(3)伯努利型
这种情况下,就如之前博文里提到的bag of words处理方式一样,最后得到的特征只有0(没出现)和1(出现过)。
参考文献:
本文通过以下资料整理得到,仅用于学习记录,如涉及版权问题,请联系本人进行删除。谢谢!
1、 寒小阳博客:NLP系列(2)_用朴素贝叶斯进行文本分类(上) https://blog.csdn.net/han_xiaoyang/article/details/50616559
2、NLP系列(3)_用朴素贝叶斯进行文本分类(下):https://blog.csdn.net/longxinchen_ml/article/details/50629110
3、NLP系列(4)_朴素贝叶斯实战与进阶:https://blog.csdn.net/han_xiaoyang/article/details/50629608
3、网易云课堂NLP课程:文本分类