什么是朴素贝叶斯?
是一种基于贝叶斯定理和特征条件独立假设的分类方法,即对于给定的训练数据集,首先基于特征条件独立假设学习输入、输出的联合概率分布,人后基于此模型,对于给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
朴素贝叶斯方法是一组基于Bayes定理的有监督学习算法,在给定类变量值的情况下,假设每一对特征之间的条件独立性为“朴素”假设。Bayes定理给出了给变量y和相关特征向量x1~xn的公式 :
常用于文本分类和垃圾邮件分类等。
朴素贝叶斯的类别:
(1)高斯朴素贝叶斯
主要用于TF-IDF方法的文本实数化后的特征进行分类,但是存在对稀疏矩阵处理的问题。
其中数据通常表示为字向量计数,尽管TF-IDF在实践中也很好地工作。
相关公式与上面推导相同:
1. 平滑处理
存在样本对应特征为0 的情况,为了避免如果有一个特征统计的概率为0,则联合概率也为零那自然没有什么意义了, 如果训练样本足够大时,并不会对比较结果产生影响.
由于各个独立特征的概率都是小于1的数,累积起来必然会是个更小的数,这会遇到浮点数下溢的问题,因此可以对所有的概率都取了对数处理,避免这种情况。
(1)布尔型表示
只考虑词语是否在文本中出现,出现用1标识,没出现用0标识。
(2)count计数表示
考虑词语在文本中出现的次数,出现几次标识对应数据,没出现用0标识。
特征是整数型的。
(3)tf-idf表示
不仅考虑词语在文本中出现的次数,进一步考虑词语的重要性,认为出现次数越多越不重要。
词频 (term frequency, TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
手推关于垃圾邮件分类的例子
存在3个垃圾邮件和3个正常邮件,这里直接用相关特定词语表示邮件。
垃圾邮件:
- 点击,更多,信息 2.最新,产品 3.信息,点击,链接
正常邮件:
- 开会 2. 信息,详见,邮件 3. 最新,信息
存在一个新邮件“最新,产品,实惠,点击,链接",判断新邮件是正常邮件还是垃圾邮件?
(1)创建词库(所有训练集中的词语)
{点击,更多,信息,最新,产品,链接,开会,详见,邮件}
(2)计算条件概率
p(产品|垃圾)=2/17,p(链接|垃圾)=2/17,p(开会|垃圾)=1/17,
p(详见|垃圾)=1/17,p(邮件|垃圾)=1/17
以上概率相加为1.
p(更多|正常)=1/15,p(信息|正常)=3/15,p(最新|正常)=2/15,
p(产品|正常)=1/15,p(链接|正常)=1/15,p(开会|正常)=2/15,
p(详见|正常)=2/15,p(邮件|正常)=2/15,p(点击|正常)=1/15
(3)先验概率
p(正常)=1/2,p(垃圾)=1/2
(4)计算分类概率
如果p(正常|邮件内容)<p(垃圾|邮件内容),则认为该邮件是垃圾邮件。
故新邮件属于垃圾邮件。
python实例
采用SMS垃圾短信语料库中的数据进行模型训练。
(1)读取数据
得到:
label text
0 ham Go until jurong point, crazy.. Available only ...
1 ham Ok lar... Joking wif u oni...
2 spam Free entry in 2 a wkly comp to win FA Cup fina...
3 ham U dun say so early hor... U c already then say...
4 ham Nah I don't think he goes to usf, he lives aro...
(2)数据处理
得到:
label text numlabel
0 ham Go until jurong point, crazy.. Available only ... 0
1 ham Ok lar... Joking wif u oni... 0
2 spam Free entry in 2 a wkly comp to win FA Cup fina... 1
3 ham U dun say so early hor... U c already then say... 0
4 ham Nah I don't think he goes to usf, he lives aro... 0
得到:
0 4825
1 747
Name: numlabel, dtype: int64
5572
得到:
the minimum length is:2
得到:
得到:
(5572, 8712)
得到:
训练集种的样本量:4457 测试集种的样本量:1115
得到:
朴素贝叶斯
0.9865470852017937 0.9786626344086021
0.967741935483871 0.9375 0.9523809523809523
(4)利用tf-idf从文本中提取特征后进行训练和预测
得到:
(5572, 8712)
得到:
训练集种的样本量:4457 测试集种的样本量:1115
得到:
朴素贝叶斯
accuracy on test data: 0.9668161434977578 0.8806451612903226
(3)和(4)的区别在于一个是基于词语计数得到的特征,一个是利用tf_idf得到的特征,从结果可以看出,(3)中结果更好一些,可能原因:tf_idf得到的特征是实数形式,利用MultinomialNB进行训练预测时效果不是特别显著。