转载自寒老师的文章
文章目录
1 引言
2 贝叶斯公式
P
(
Y
∣
X
)
=
P
(
X
,
Y
)
P
(
X
)
=
P
(
Y
)
P
(
X
∣
Y
)
P
(
X
)
P(Y|X) = \dfrac{P(X,Y)}{P(X)}=\dfrac{P(Y)P(X|Y)}{P(X)}
P(Y∣X)=P(X)P(X,Y)=P(X)P(Y)P(X∣Y)
贝叶斯公式实现了在生成模型和判别模型之间转换。
3 用机器学习的视角理解贝叶斯公式
在机器学习视角下,我们把X当做“具有某特征”,Y看做“类别标签”。在简单二分类中,我们把Y理解成“属于某类”,于是贝叶斯公式变成了:
P
(
属
于
某
类
∣
具
有
某
特
征
)
=
P
(
具
有
某
特
征
∣
属
于
某
类
)
P
(
属
于
某
类
)
P
(
具
有
某
特
征
)
P(属于某类|具有某特征)=\dfrac{P(具有某特征|属于某类)P(属于某类)}{P(具有某特征)}
P(属于某类∣具有某特征)=P(具有某特征)P(具有某特征∣属于某类)P(属于某类)
P(“属于某类”|“具有某特征”)= 在已知某样本“具有某特征”的条件下,该样本“属于某类”的概率。所以叫做『后验概率』。
P(“具有某特征”|“属于某类”)=在已知某样本“属于某类”的条件下,该样本“具有某特征”的概率。
P(“属于某类”)=(在未知某样本具有该“具有某特征”的条件下,)该样本“属于某类”的概率。所以叫做『先验概率』。
P(“具有某特征”)=(在未知某样本“属于某类”的条件下,)该样本“具有某特征”的概率。
4 垃圾邮件识别
P(垃圾邮件|具有某特征)
P
(
"
垃
圾
邮
件
"
∣
"
我
司
可
办
理
正
规
发
票
17
%
增
值
税
发
票
点
数
优
惠
"
)
=
垃
圾
邮
件
中
出
现
这
句
话
的
次
数
垃
圾
邮
件
中
出
现
这
句
话
的
次
数
+
正
常
邮
件
中
出
现
这
句
话
的
次
数
P("垃圾邮件"|"我司可办理正规发票17\%增值税发票点数优惠") =\dfrac{垃圾邮件中出现这句话的次数}{垃圾邮件中出现这句话的次数+正常邮件中出现这句话的次数}
P("垃圾邮件"∣"我司可办理正规发票17%增值税发票点数优惠")=垃圾邮件中出现这句话的次数+正常邮件中出现这句话的次数垃圾邮件中出现这句话的次数
5 分词
训练集是有限的。句子是无限的。但词语是有限的。汉语常用字2500个,常用词语56000个。所以不用句子做特征,而是用句子中的词语的组合作为特征。需要分词。
于是贝叶斯公式变为:
P
(
“
垃
圾
邮
件
”
∣
(
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
”
,
“
增
值
税
”
,
“
发
票
”
,
“
点
数
”
,
“
优
惠
”
)
)
=
P
(
(
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
”
,
“
增
值
税
”
,
“
发
票
”
,
“
点
数
”
,
“
优
惠
”
)
∣
"
垃
圾
邮
件
"
)
P
(
“
垃
圾
邮
件
”
)
P
(
(
“
我
”
,
“
司
”
,
“
可
”
,
“
办
理
”
,
“
正
规
发
票
”
,
“
保
真
”
,
“
增
值
税
”
,
“
发
票
”
,
“
点
数
”
,
“
优
惠
”
)
)
P(“垃圾邮件”|(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)) =\dfrac{P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)|"垃圾邮件")P(“垃圾邮件”)}{P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))}
P(“垃圾邮件”∣(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))=P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)∣"垃圾邮件")P(“垃圾邮件”)
6 条件独立假设
概率 P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)|“垃圾邮件”) 依旧不够好求,我们引进一个很朴素的近似。假设认为每个词出现的概率与其他词没有关系。这就是条件独立假设。近似公式如下:
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(“办理”|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(“发票”∣S)×P(“点数”∣S)×P(“优惠”∣S)
7 朴素贝叶斯(Naive Bayes),“Naive”在何处?
在朴素贝叶斯眼里,“我司可办理正规发票”与“正规发票可办理我司”完全相同。朴素贝叶斯失去了词语之间的顺序信息。这就相当于把所有的词汇扔进到一个袋子里随便搅和,贝叶斯都认为它们一样。因此这种情况也称作词袋子模型(bag of words)。
8 简单高效
9 处理重复语言的三种方式
9.1 伯努利模型
如果重复出现的词语当做1次,那么
P
(
发
票
∣
S
)
=
出
现
"
发
票
"
的
垃
圾
邮
件
的
封
数
垃
圾
邮
件
样
本
中
所
有
词
出
现
次
数
总
和
(
出
现
了
只
算
一
次
)
P(发票|S)=\dfrac{出现"发票"的垃圾邮件的封数}{垃圾邮件样本中所有词出现次数总和(出现了只算一次)}
P(发票∣S)=垃圾邮件样本中所有词出现次数总和(出现了只算一次)出现"发票"的垃圾邮件的封数
9.2 多项式模型
重复的词语视为出现了多次。
P
(
发
票
∣
S
)
=
每
封
垃
圾
邮
件
中
出
现
"
发
票
"
次
数
的
总
和
垃
圾
邮
件
样
本
中
所
有
词
出
现
次
数
总
和
(
计
算
重
复
次
数
)
P(发票|S)=\dfrac{每封垃圾邮件中出现"发票"次数的总和}{垃圾邮件样本中所有词出现次数总和(计算重复次数)}
P(发票∣S)=垃圾邮件样本中所有词出现次数总和(计算重复次数)每封垃圾邮件中出现"发票"次数的总和
10 去除停用词与选择关键词
11 浅谈平滑技术
如果在预测阶段出现了一个训练语料中没有的词,这个时候概率为0,可就糟糕了。
平滑技术认为可以给每个词赋值一个很小的概率。
对于伯努利模型:
P
(
发
票
∣
S
)
=
出
现
"
发
票
"
的
垃
圾
邮
件
的
封
数
+
1
垃
圾
邮
件
样
本
中
所
有
词
出
现
次
数
总
和
(
出
现
了
只
算
一
次
)
+
2
P(发票|S)=\dfrac{出现"发票"的垃圾邮件的封数+1}{垃圾邮件样本中所有词出现次数总和(出现了只算一次)+2}
P(发票∣S)=垃圾邮件样本中所有词出现次数总和(出现了只算一次)+2出现"发票"的垃圾邮件的封数+1
对于多项式模型:
P
(
发
票
∣
S
)
=
每
封
垃
圾
邮
件
中
出
现
"
发
票
"
次
数
的
总
和
+
1
垃
圾
邮
件
样
本
中
所
有
词
出
现
次
数
总
和
(
计
算
重
复
次
数
)
+
被
统
计
的
词
表
的
词
语
数
量
P(发票|S)=\dfrac{每封垃圾邮件中出现"发票"次数的总和+1}{垃圾邮件样本中所有词出现次数总和(计算重复次数)+被统计的词表的词语数量}
P(发票∣S)=垃圾邮件样本中所有词出现次数总和(计算重复次数)+被统计的词表的词语数量每封垃圾邮件中出现"发票"次数的总和+1
12 内容总结
贝叶斯公式+条件独立假设=朴素贝叶斯
13 为什么不直接匹配关键词
准确率低。
14 实际工程的tricks
-
trick1:取对数。
C=P(“我”|S)P(“司”|S)P(“可”|S)P(“办理”|S)P(“正规发票”|S)
×P(“保真”|S)P(“增值税”|S)P(“发票”|S)P(“点数”|S)P(“优惠”|S)P(“垃圾邮件”)
这里进行了很多乘法运算,计算的时间开销比较大。尤其是对于篇幅比较长的邮件,几万个数相乘起来还是非常花时间的。如果能把这些乘法变成加法则方便得多。刚好数学中的对数函数log就可以实现这样的功能。两边同时取对数(本文统一取底数为2),则上面的公式变为:
logC=logP(“我”|S)+logP(“司”|S)+logP(“可”|S)+logP(“办理”|S)+logP(“正规发票”|S)
+logP(“保真”|S)+logP(“增值税”|S)+logP(“发票”|S)+logP(“点数”|S)+logP(“优惠”|S)+logP(“垃圾邮件”)
有同学可能要叫了:“做对数运算岂不会也很花时间?”的确如此,但是可以在训练阶段直接计算 logP ,然后把他们存在一张大的hash表里。在判断的时候直接提取hash表中已经计算好的对数概率,然后相加即可。这样使得判断所需要的计算时间被转移到了训练阶段,实时运行的时候速度就比之前快得多,这可不止几个数量级的提升。 -
trick2:转换为权重
对于二分类问题,我们可以继续提高判断速度。既然要比较logC和 l o g C − logC^{-} logC−的大小,可以上下相除,
这样可以根据权重的大小来评估和筛选显著的特征,比如关键词。而这些权重值可以直接提前计算好而存在hash表中 。判断的时候直接将权重求和即可。 -
trick3:选取topk的关键词
用提取关键词的方法,提取一段文本中的关键词。作为评判的关键词。
对k个关键词权重加和。k是超参数。
词的权重是在全量词上计算。 -
trick4:分割样本
topk关键词的方法需要考虑篇幅的影响。这里有许多种处理方式,它们的基本思想都是选取词语的个数及对应的阈值要与篇幅的大小成正比,本文只介绍其中一种方方法:
对于长篇幅邮件,按一定的大小,比如每500字,将其分割成小的文本段落,再对小文本段落采用topk关键词的方法。只要其中有一个小文本段落超过阈值就判断整封邮件是垃圾邮件。
对于超短篇幅邮件,比如50字,可以按篇幅与标准比较篇幅的比例来选取topk,以确定应该匹配关键词语的个数。比如选取 50/500×15≈2 个词语进行匹配,相应的阈值可以是之前阈值的 2/15 。以此来判断则更合理。 -
trick5:位置权重
可以根据词语出现的位置,对其权重再乘以一个放大系数,以扩大其对整封邮件的影响,提高识别准确度。
15 贝叶斯方法的思维方式
15.1 逆概率问题
P
(
Y
∣
X
)
=
P
(
Y
)
P
(
x
∣
Y
)
P
(
X
)
P(Y|X)=\dfrac{P(Y)P(x|Y)}{P(X)}
P(Y∣X)=P(X)P(Y)P(x∣Y)
贝叶斯公式能够揭示两个相反方向的条件概率之间的转换关系。
基于样本特征去判断其所属标签的概率不好求,但是基于已经搜集好的打上标签的样本(有监督),却可以直接统计属于同一标签的样本内部各个特征的概率分布。因此贝叶斯方法的理论视角适用于一切分类问题的求解。
15.2 处理多分类问题
15.3 先验概率的问题
这里终于明白频率学派和贝叶斯学派在争什么。如果先验概率靠谱,则用频率学派的观点,否则可以使用似然函数估计。