Jiahonzheng's Blog

朴素贝叶斯分类器

字数统计: 1k阅读时长: 4 min
2019/09/29 Share

原理

朴素贝叶斯分类器,是一种常用的机器学习模型,其核心是贝叶斯公式:

在二分类问题中,$A$ 是标签值,$B$ 是特征值,$P(A|B)$ 为后验概率,$P(A)$ 和 $P(B)$ 为边缘概率,$P(B|A)$ 为似然。我们使用所有的训练样本(包含标签和特征),计算出 $P(A)$ 、 $P(B|A)$ 和 $P(B)$ ,最后求得后验概率 $P(A|B)$ 。

贝叶斯分类器的预测过程如下:我们比较每一类的后验概率,取后验概率最大的那一类作为输出的标签值

具体分析

现在,我们尝试使用朴素贝叶斯构建垃圾邮件过滤器。首先,我们定义 $y$ 为标签,定义 $S$ 为垃圾邮件标签,定义 $H$ 为正常邮件标签。除此之外,我们还定义:

  • $P(y=S)$ :垃圾邮件 $Spam$ 的概率
  • $P(y=H)$ :正常邮件 $Ham$ 的概率
  • $P(W_i|y=S)$ :单词 $W_i$ 出现在垃圾邮件的概率
  • $P(W_i|y=H)$ :单词 $W_i$ 出现在正常邮件的概率

当预测 $S$ 标签时,根据贝叶斯公式,我们有以下关系式:

由于 $(2)$ 式右边的分母对于各标签的预测都是一致的,因此我们可以“忽略”,可得以下正比关系:

由于 $W_1,W_2,\dots,W_n$ 在 $y$ 出现的概率是相互独立的,即:

将 $(4)$ 式代入 $(3)$ 式,可得:

对于一封邮件,我们的输出标签满足以下关系:

模型平滑

在模型训练过程中,如果我们通过直接统计某样本在训练数据集中的分布来求取概率,则这种方法是最大似然估计法。

$I()$ 是指示函数,用于统计满足某一条件的频数。

由于在训练过程中,可能出现零概率问题,导致模型可能是不平滑的。为此,我们需要引入贝叶斯估计

$K_y$ 是 $y$ 标签下的单词种类数。

当 $\lambda=0$ 时,称为最大似然估计;当 $\lambda=1$ 时,称为拉普拉斯平滑

数据集

我们使用的是 Ling-Spam 数据集,包含特征集标签集,可在 https://github.com/Jiahonzheng/AI-Assignments/tree/master/Spam%20Filter/data 下载。

特征集格式:{email_id} {word_id} {word_num} ,表示在编号为 email_id (以 1 开始)的邮件中,编码为 word_id 的单词的出现次数为 word_num 。例如,在下面的示例中,表示在编号为 1 的邮件中,编号为 8 的单词出现的次数为 1

1
2
# 特征集数据示例
1 8 1

标签集格式:{0 or 1} ,表示当前行号(以 1 开始)对应的邮件的标签,正常邮件为 0 ,垃圾邮件为 1

以下是数据集的概览。

数据概况 features features-50 features-100 features-400
训练集 测试集 训练集 测试集 训练集 测试集 训练集 测试集
垃圾邮件数 350 130 25 130 50 130 200 130
正常邮件数 350 130 25 130 50 130 200 130
单词数 2467 2421 1468 2421 1951 2421 2447 2421

模型性能

执行训练后,我们对模型进行测试,从下面的表格中,我们可以发现模型性能与数据集大小呈正相关的关系

性能 features features-50 features-100 features-400
Precision 0.9808 0.8692 0.9769 0.9769
Recall 0.9923 0.7462 0.9769 0.9692
F1-Score 0.9865 0.8030 0.9769 0.9730

实现代码

模型的实现代码可在 https://github.com/Jiahonzheng/AI-Assignments/tree/master/Spam%20Filter 查看。

CATALOG
  1. 1. 原理
  2. 2. 具体分析
  3. 3. 模型平滑
  4. 4. 数据集
  5. 5. 模型性能
  6. 6. 实现代码