找回密码
 立即注册
首页 业界区 业界 朴素贝叶斯算法预测中文钓鱼邮件

朴素贝叶斯算法预测中文钓鱼邮件

坠矜 4 小时前
目录

  • 大致步骤

    • 第一步:准备工具(训练模型)
    • 第二步:分析目标邮件(实际判断)

      • 1. 提取这封邮件的特征
      • 2. 计算两种可能性得分
      • 3. 做出判断

    • 第三步:现实中的优化

  • 朴素贝叶斯算法定义
  • Reference

下文以一个检测钓鱼邮件的案例来学习这个算法的原理。
需求:
收到一封新邮件,程序怎么自动判断它是否为钓鱼邮件?
大致步骤

第一步:准备工具(训练模型)

目的:先让计算机学会识别钓鱼邮件的特征。

  • 收集历史邮件数据:

    • 1000封已知类型的邮件
    • 其中:300封钓鱼邮件,700封正常邮件。
      学校邮件中30%是钓鱼邮件(这是你的先验知识)。

  • 提取关键特征:
    我们关注邮件中是否出现某些关键词:
    1. ["免费", "账号", "验证", "点击", "紧急", "赢取", "密码", "链接"]
    复制代码
  • 计算基础概率:
    1. P(钓鱼) = 300/1000 = 0.3
    2. P(正常) = 700/1000 = 0.7
    复制代码
  • 计算每个词的条件概率:
    以"免费"这个词为例:

    • 在300封钓鱼邮件中,270封包含"免费" → P(免费|钓鱼) = 270/300 = 0.9
    • 在300封钓鱼邮件中,240封包含"账号" → P(账号|钓鱼) = 240/300 = 0.8
    • 在700封正常邮件中,70封包含"免费" → P(免费|正常) = 70/700 = 0.1
    • ......(用同样方法计算其他词的概率)

第二步:分析目标邮件(实际判断)

现在你要判断这封具体的邮件:
  1. 主题:账户安全通知
  2. 内容:尊敬的客户,您的账号存在异常登录,请立即点击下方链接验证身份,否则将被暂停使用。
复制代码
对邮件主题和内容进行中文分词的过程,这里忽略掉了。
判断过程如下:
1. 提取这封邮件的特征

检查邮件中是否包含我们的关键词:

  • 包含"账号":✓
  • 包含"验证":✓
  • 包含"点击":✓
  • 包含"链接":✓
  • 包含"免费":✗
  • 包含"赢取":✗
  • 包含"密码":✗
  • 包含"紧急":✓("立即"可视为紧急)
2. 计算两种可能性得分

我们需要计算:这封邮件是钓鱼的可能性 vs 这封邮件是正常的可能性
计算公式简化版:
  1. 得分(钓鱼) = P(钓鱼) × P(特征1|钓鱼) × P(特征2|钓鱼) × ...
  2. 得分(正常) = P(正常) × P(特征1|正常) × P(特征2|正常) × ...
复制代码
实际计算(使用训练阶段的数据):
A. 假设钓鱼可能性计算:
  1. P(钓鱼) = 0.3
  2. P(账号|钓鱼) = 0.8  (假设值)
  3. P(验证|钓鱼) = 0.7  (假设值)
  4. P(点击|钓鱼) = 0.85 (假设值)
  5. P(链接|钓鱼) = 0.9  (假设值)
  6. P(免费|钓鱼) = 0.9,但邮件中没有"免费" → 用(1-0.9)=0.1
  7. P(紧急|钓鱼) = 0.75 (假设值)
  8. 得分_钓鱼 = 0.3 × 0.8 × 0.7 × 0.85 × 0.9 × 0.1 × 0.75
  9.           = 0.3 × 0.0003213 ≈ 0.0000964
复制代码
B. 假设正常可能性计算:
  1. P(正常) = 0.7
  2. P(账号|正常) = 0.1  (假设值)
  3. P(验证|正常) = 0.05 (假设值)
  4. P(点击|正常) = 0.08 (假设值)
  5. P(链接|正常) = 0.12 (假设值)
  6. P(免费|正常) = 0.1,但邮件中没有"免费" → 用(1-0.1)=0.9
  7. P(紧急|正常) = 0.15 (假设值)
  8. 得分_正常 = 0.7 × 0.1 × 0.05 × 0.08 × 0.12 × 0.9 × 0.15
  9.           = 0.7 × 0.00000648 ≈ 0.00000454
复制代码
3. 做出判断

比较两个得分:

  • 钓鱼得分:0.0000964
  • 正常得分:0.00000454
因为 0.0000964 > 0.00000454,所以判断这封邮件很可能是钓鱼邮件。
第三步:现实中的优化

实际应用中,为了避免数值太小和未出现词的问题,会做以下调整:

  • 使用对数计算(避免小数点太多):
    1. log(得分_钓鱼) = log(0.3) + log(0.8) + log(0.7) + ...
    2. log(得分_正常) = log(0.7) + log(0.1) + log(0.05) + ...
    复制代码
    比较对数分数,结果相同但更稳定。
  • 拉普拉斯平滑:
    如果某个词在训练数据中从未在钓鱼邮件中出现过(概率为0),我们会给它一个很小的概率(如0.001),避免整个乘积为0。
朴素贝叶斯算法定义

朴素贝叶斯是一种基于概率论的分类算法,其核心思想是利用贝叶斯定理来预测一个样本属于哪个类别。 它的“朴素”之处在于假设样本的各个特征之间是相互独立、互不影响的,尽管这一假设在现实中往往不成立,但它极大地简化了计算,使得算法在很多复杂场景下仍然表现出色。
虽然独立事件往往并不能反映现实生活,但计算独立事件的概率要比计算非独立事件的概率容易得多。这种算法广泛应用于文本分类、垃圾邮件过滤和情感分析等领域。
假设有一个数据集,由两类组成(简化问题),对于每个样本的分类,我们都已经知晓。数据分布如下图:
1.png

现在出现一个新的点new_point (x,y),其分类未知。我们可以用p1(x,y)表示数据点(x,y)属于红色一类的概率,同时也可以用p2(x,y)表示数据点(x,y)属于蓝色一类的概率。那要把new_point归在红、蓝哪一类呢?
我们提出这样的规则:
  1. 如果p1(x,y) > p2(x,y),则(x,y)为红色一类。
  2. 如果p1(x,y) <p2(x,y),  则(x,y)为蓝色一类。
复制代码
也就是说,在出现一个需要分类的新点时,我们只需要计算这个点的:
  1. 如果p(red|x,y) > p(blue|x,y), 则(x,y)属于红色一类。
  2. 如果p(red|x,y) < p(blue|x,y), 则(x,y)属于蓝色一类。
复制代码
Reference

朴素贝叶斯算法 & 应用实例
http://www.cnblogs.com/marc01in/p/4775440.html

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册