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,计算所有的
==输出结果:==预测概率最大的类别作为输出
- 优缺点
- 优点
- 算法简单,常用于文本分类
- 兼容多分类任务
- 适合增量计算
- 缺点
- 顺序不敏感(词与词之间是离散的)
- 依赖先验概率(与数据分布强相关,有的类别多,有的类别少)
- 适合离散特征(基于独立同分布假设,同时也是这种假设,使得该方法简单,易于实现)
- 优点
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) | 60 | 0 |
科技(40) | 40 | 0 |
求得 =>
精确率:正确预测为军事的样本数 / 预测为军事的样本数 P = 60 / (60 + 40) = 60%
召回率:正确预测为军事的样本数 / 实际为军事的样本数 R = 60 / 60 = 100%
所以不能追求单一的 P 或者 R 高,这两个指标需要协调兼顾。
2. PR 曲线
0x05 面试题
- 朴素贝叶斯算法,对缺失值、异常值是否敏感?
答:敏感。比如对于没有计算过概率的词语,只能赋给一个默认值。
- 朴素贝叶斯为什么适合增量计算?
答:因为朴素贝叶斯本质是计算概率,这些概率是从统计得到。比如之前有 1000 篇文章,后面增加了 500 篇,只需要在之前的基础上统计新的数据,得到新的概率就可以了。或者说,模型可以比较容易地基于之前的模型,继续训练。
- 朴素贝叶斯的优缺点?
答:优点:简单,常用于文本分类;适合增量计算。缺点:数据离散,词语之前不连续,对位置信息不敏感;依赖先验概率。
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