2.1 传统机器学习 & 朴素贝叶斯

0x00 Abstract

机器学习是深度学习的基础,这篇笔记是对机器学习这部分内容的一个开篇。了解什么是机器学习,然后学习一个经典的朴素贝叶斯模型,并运用到文本分类的实践。

0x01 简介

  • 人类学习:
    • 为了实现目标任务:考清华(任务)
    • 通过一定训练过程:每天 10 道模拟题(数据)
    • 逐步提高表现:降低错误(Loss)
  • 机器学习:
    • 模拟人类的学习,从数据中总结出规律经验,在新场景中预测
    • 常用的数据驱动方法:
    • 将上述方法用数据建模:

总结:机器学习,基于大量历史数据,通过学习形成经验模型,利用模型指导具体业务。

  • 对于 ML 最重要的两点:数据 + 模型
    • 数据决定了高度
    • 模型决定了达到高度的方法
    • 从我的理解来讲,数据决定了下限,数据好的话出来的效果一般不会差(哪怕用简单的模型);模型决定了上限,特别适合任务场景的模型会带来意想不到的效果。

模型训练流程:

机器学习的定位:

机器学习的任务类型:分类、回归、聚类和推荐

方法目标
朴素贝叶斯- 侧重 NLP 文本处理
- 最容易上手的分类算法,实用性强
LR 逻辑回归- 最重要、最核心、最常用的分类算法
- 常用于最核心的点击率模型等排序业务
- 解决二分类问题,深度学习必备基础
Softmax- 可以当作 LR 逻辑回归的升级版
- 解决多分类问题,深度学习的必备基础

0x02 朴素贝叶斯的理论基础

==任务:==给定一篇文章,预测出其类别(财经类、科技类、生活类等)

最直观的方法:将文章中所有的词作为词袋,基于提前构建好的规则(贝叶斯公式),得到预测结果。

可能存在的问题:歧义、一词多义等。(如:苹果——手机?水果?)

先不去管这些问题,如果我们顺着这条道,怎么才能走通?

==公式:==基于贝叶斯原理的概率模型分类器

补充:贝叶斯公式 P(A|B) = P(A,B) / P(B) = P(B|A) * P(A) / P(B) P(A, B) = P(B|A) * P(A) = P(A|B) * P(B)

因为一篇文章 由 n 个 词语 构成,所以不难理解公式推导最后一步时,等于各个词语(特征)连乘。

换种方式表述:

参数:

各概率的含义:

:在指定文章的情况下,该文章类别为 的概率

==策略:==最大似然估计——MLE(如何得到模型中需要用到的两个概率)

  • :每个类别的先验概率

例如:总共训练数据 1000 篇,其中军事类 300 篇,科技类 240 篇,生活类 140 篇。可得以下先验概率。 > P(军事)=0.3, P(科技)=0.24, P(生活)=0.14,......

  • :在指定类别下,某个单词出现的概率

例如:总共训练数据 1000 篇,其中军事类 300 篇,科技类 240 篇,生活类 140 篇。

已知在军事类新闻中,“谷歌”出现 15 篇,“投资”出现 9 篇,“上涨”出现 36 篇。可得以下概率。 > P(谷歌|军事)= 15/300 = 0.05, P(投资|军事)= 9/300 = 0.03, > P(上涨|军事)= 36/300 = 0.12,......

这里的统计其实有两种方式,一种是基于单词统计(以单词为单位),另一种是基于文章统计(以文章为单位)。

上面的例子是以文章为单位。在 300 军事类新闻中,“谷歌”出现 15 篇(不关心同一篇文章中重复出现的次数,只关心该词语在几篇文章中出现过),直接用 15 除以该类别文章总数 300。

如果以单词为单位,则是用每个单词出现的次数除以该类别总的单词出现次数。(建议不重复计数,具体原因在朴素贝叶斯原理分析及文本分类实战有讲。)

=> 小结:至此,便可以根据公式得到某篇文章是某个类别的概率。

    • P(军事)=0.3, P(科技)=0.24, P(生活)=0.14,......
  • :给定了一个 ,去求各个特征(文章中的词语)的概率
    • P(谷歌|军事)=0.05, P(投资|军事)=0.03, P(上涨|军事)=0.12,......
    • P(谷歌|科技)=0.15, P(投资|科技)=0.10, P(上涨|科技)=0.04,......
    • P(谷歌|生活)=0.08, P(投资|生活)=0.13, P(上涨|生活)=0.18,......
    • ......

为什么说这种策略是最大似然估计呢?

下面补充一下概念。

概率函数:在某个场景下(一定条件下),某个事件发生的概率(推结果)

似然函数:已知某个事件的发生(结果已知),该事件在不同条件下发生的可能性,(反推场景的参数 or 条件)

最大似然值(似然函数的最大值):根据已知事件,推出产生这种结果的最有可能的条件(参数)

结合当前例子理解 MLE 的理论,可以发现:最大似然估计,就是通过已知结果(数据),反推得到模型参数的过程。

==分类规则:==给定一篇文章 X,计算所有的 ,选择概率值最大的 作为输出(输出可能性最大的类别) - 给定文章 - X = {国内,投资,市场,......} - 计算各种类别概率 - P(军事|X)=P(国内|军事) * P(投资|军事) * P(市场|军事)......P(军事) - 文章所有的词为军事类别的概率(事前算好的)连乘 - P(科技|X) - P(生活|X)

==输出结果:==预测概率最大的类别作为输出

  • 优缺点
    • 优点
      • 算法简单,常用于文本分类
      • 兼容多分类任务
      • 适合增量计算
    • 缺点
      • 顺序不敏感(词与词之间是离散的)
      • 依赖先验概率(与数据分布强相关,有的类别多,有的类别少)
      • 适合离散特征(基于独立同分布假设,同时也是这种假设,使得该方法简单,易于实现)

0x03 朴素贝叶斯的实践

代码放在了我的 repo 里:Dive-into-NLP/2.ml-and-dl-foundation/2.1.naive-bayes-model at main · 1nnoh/Dive-into-NLP · GitHub

1. 实践一

python DataConvert.py data/ nb_data

# train
python NB.py 1 nb_data.train model

# test
python NB.py 0 nb_data.test model out

在使用 DataConvert.py 做数据预处理这一步,我用的 wsl2 子系统会把隐藏文件一起处理。

所以在这行代码后面加一个筛选:

for filename in os.listdir(inpath):
	if not filename.startswith('.'):  # 筛除以 “.” 开头的隐藏文件

2. 实践二(作业)

换个数据集 /nb_homework/data

该数据集划分好了训练集测试集,但是没有分词。每篇文章如 7_52.txt 的命名,下划线之前为该文章类别。

数据:
	训练集:6300篇
	测试集:700篇

标签:1 财经;2 科技;3 汽车;4 房产;5 体育;6 娱乐;7 其他

0x04 评估指标

1. 混淆矩阵

  • 准确度 Accuracy:(50 + 35) / (35 + 5 + 10 + 50) = 85%
  • 精确率(查准率) Precision:50 / (50 + 5) = 90.9% (竖着看)
  • 召回率 Recall:50 / (50 + 10) = 83.3% (横着看)

如何去看待精确率与召回率? 假设一个极端情况:还是上面的例子,模型认为 100 篇文章都是军事类,那么

军事科技
军事(60)600
科技(40)400

求得 =>

精确率:正确预测为军事的样本数 / 预测为军事的样本数 P = 60 / (60 + 40) = 60%

召回率:正确预测为军事的样本数 / 实际为军事的样本数 R = 60 / 60 = 100%

所以不能追求单一的 P 或者 R 高,这两个指标需要协调兼顾。

2. PR 曲线

0x05 面试题

  1. 朴素贝叶斯算法,对缺失值、异常值是否敏感?

答:敏感。比如对于没有计算过概率的词语,只能赋给一个默认值。

  1. 朴素贝叶斯为什么适合增量计算?

答:因为朴素贝叶斯本质是计算概率,这些概率是从统计得到。比如之前有 1000 篇文章,后面增加了 500 篇,只需要在之前的基础上统计新的数据,得到新的概率就可以了。或者说,模型可以比较容易地基于之前的模型,继续训练。

  1. 朴素贝叶斯的优缺点?

答:优点:简单,常用于文本分类;适合增量计算。缺点:数据离散,词语之前不连续,对位置信息不敏感;依赖先验概率。

0x06 作业题

就是第三章实践二的内容,做完数据预处理之后,其他的同实践一。

Accuracy: 0.8657142857142858 Precision and recall for Class 1 : 0.8021978021978022 0.73 Precision and recall for Class 3 : 0.9595959595959596 0.95 Precision and recall for Class 5 : 1.0 0.95 Precision and recall for Class 4 : 0.9318181818181818 0.82 Precision and recall for Class 6 : 0.868421052631579 0.99 Precision and recall for Class 2 : 0.831858407079646 0.94 Precision and recall for Class 7 : 0.68 0.68

Conclusion

介绍了什么是机器学习。然后学习了朴素贝叶斯模型,并用于文本分类实践。

重点公式> 推导: >

References

理论: 最大似然估计(Maximum likelihood estimation) 带你理解朴素贝叶斯分类算法 - 知乎

实践: 朴素贝叶斯原理分析及文本分类实战 代码注释很详细,而且以单词为单位,以文章为单位的两种统计方式都做了实现。

代码: Dive-into-NLP/2.ml-and-dl-foundation/2.1.naive-bayes-model at main · 1nnoh/Dive-into-NLP · GitHub