机器学习--朴素贝叶斯
目录
一、先搞懂贝叶斯:从 “正向” 到 “逆向” 的概率思维
二、朴素贝叶斯:加个 “朴素假设”,解决复杂问题
例子 1:拼写纠正 —— 猜你到底想打哪个词
例子 2:垃圾邮件分类 —— 判断一封邮件是不是垃圾
三、三种常用的朴素贝叶斯模型:对应不同数据类型
1. 多项式朴素贝叶斯(MultinomialNB)
2. 高斯朴素贝叶斯(GaussianNB)
3. 伯努利朴素贝叶斯(BernoulliNB)
四、总结:朴素贝叶斯的 “简单” 与 “实用
从摸球到垃圾邮件分类:我用朴素贝叶斯搞定了机器学习里的 "概率推理"
今天跟着课程入门了机器学习里的朴素贝叶斯算法,本来以为概率相关的内容会很枯燥,结果跟着例子一步步算下来,发现这算法居然能解决好多生活里的实际问题 —— 从猜穿长裤的是男生还是女生,到帮朋友纠正打错的单词,甚至还能自动识别垃圾邮件。全程没绕复杂公式,全靠 “逆向思考” 把问题想明白,所以想把今天的收获整理下来,也给刚入门的朋友搭个理解的梯子。
一、先搞懂贝叶斯:从 “正向” 到 “逆向” 的概率思维
一开始老师先介绍了贝叶斯这个人,说是 18 世纪的英国数学家,生前写了篇关于 “逆概” 的文章没被重视,死后才被大家发现价值 —— 现在整个贝叶斯方法的基础,居然是他当年解决一个 “猜球” 问题的思路。
这个 “猜球” 问题特别好懂,分两种情况:
~正向概率:比如袋子里有 6 个白球、4 个黑球,伸手摸一个,算摸出黑球的概率。这是我们学过的基础概率,直接用 “黑球数量 / 总球数” 就能算,一点不绕。
~逆向概率:但如果我们不知道袋子里黑白球的比例,只知道摸了 3 次,摸出 2 个白球 1 个黑球,怎么推测袋子里可能的黑白球比例?这就是贝叶斯要解决的 “逆问题”—— 从结果反推原因的概率。
为了让我们更直观,老师还举了个学校里 “穿长裤猜性别” 的例子。假设学校里 60% 是男生,40% 是女生;男生全穿长裤,女生一半穿长裤、一半穿裙子。
先算正向概率:随机找个学生,穿长裤的概率是多少?其实就是 “男生穿长裤的概率 + 女生穿长裤的概率”,也就是 60%×100% + 40%×50% = 80%。
但更实用的是逆向概率:迎面走来个穿长裤的学生,ta 是女生的概率有多大?这时候就不能直接用 40% 算了,得结合 “穿长裤” 这个条件来调整。
老师带着我们一步步推:假设学校总人数是 U,穿长裤的女生数量就是 U×40%×50%,穿长裤的总人数是 U×60%×100% + U×40%×50%。把这两个数相除,U 会被约掉,最后算出概率是(40%×50%)/(60%×100% + 40%×50%) = 25%。
也就是穿长裤的人里,只有 25% 是女生 —— 这个结果比直接看女生占比 40% 更准确,因为结合了 “穿长裤” 这个观测到的信息。
而这背后的逻辑,就是贝叶斯公式的核心:P (类别 | 观测数据) = [P (类别)×P (观测数据 | 类别)] / P (观测数据)。简单说,就是用 “先验概率”(比如女生占 40%)和 “似然概率”(比如女生穿长裤的概率 50%),结合观测到的信息(穿长裤),算出更精准的 “后验概率”(穿长裤的是女生的概率 25%)。
二、朴素贝叶斯:加个 “朴素假设”,解决复杂问题
理解了贝叶斯公式,接下来就是 “朴素贝叶斯”。老师说 “朴素” 两个字是关键 —— 它假设所有特征之间是独立的,互不影响。这个假设看起来有点 “简单粗暴”,但能大大简化计算,还能解决很多实际问题。
例子 1:拼写纠正 —— 猜你到底想打哪个词
比如我们输入 “tlp”,字典里没有这个词,算法怎么猜我们想打 “top” 还是 “tip”?
这里的 “观测数据 D” 就是 “tlp”,“猜测 h” 就是可能的正确单词(top、tip 等)。根据贝叶斯公式,P (h|D) = [P (h)×P (D|h)] / P (D)。
因为不管猜哪个 h,P (D)(也就是输入 “tlp” 的概率)都是一样的,所以比较的时候可以忽略,只需要算 P (h)×P (D|h)。
P (h) 是 “先验概率”:比如 “top” 在日常文本中出现的频率比 “tip” 高,所以 P (top) > P (tip)。
P (D|h) 是 “似然概率”:比如 “top” 错写成 “tlp”,只需要改一个字母(o→l);“tip” 错写成 “tlp”,也需要改一个字母(i→l),所以两者的 P (D|h) 差不多。
这时候 “先验概率” 就起了关键作用 —— 因为 “top” 出现频率更高,所以算法会优先猜我们想打 “top”。
例子 2:垃圾邮件分类 —— 判断一封邮件是不是垃圾
再比如判断邮件是不是垃圾邮件。这里 “观测数据 D” 是邮件里的所有单词,“类别 h” 分两种:h+(垃圾邮件)、h-(正常邮件)。
首先算 “先验概率”:如果邮件库中有 30% 是垃圾邮件,那 P (h+) = 30%,P (h-) = 70%。
然后算 “似然概率” P (D|h+):也就是 “垃圾邮件中出现这些单词的概率”。因为邮件里有很多单词(d1、d2、d3...),如果考虑单词之间的关联,计算会特别复杂 —— 这时候 “朴素假设” 就派上用场了:假设每个单词出现是独立的,所以 P (d1,d2...|h+) = P (d1|h+)×P (d2|h+)×...×P (dn|h+)。
比如 “免费”“中奖” 这两个词,在垃圾邮件中出现的频率很高,所以 P (免费 | h+) 和 P (中奖 | h+) 都很大,两者相乘后,整个似然概率就会很高。
最后比较 P (h+|D) 和 P (h-|D),哪个大就归为哪类 —— 这样就能自动识别垃圾邮件了。
三、三种常用的朴素贝叶斯模型:对应不同数据类型
除了理论,今天还学了怎么用代码实现朴素贝叶斯,而且不同数据类型要选不同的模型,这点特别重要:
1. 多项式朴素贝叶斯(MultinomialNB)
适合离散型数据,比如文本分类里的 “单词出现次数”。比如统计一篇文章里 “免费”“中奖” 出现了多少次,就用这个模型。
代码里要从 sklearn 调用 MultinomialNB,还有个关键参数 “alpha”—— 用来加 “拉普拉斯平滑”,避免某些单词没出现过导致概率为 0 的情况(alpha=1 是默认值,设为 0 就是不加平滑)。
2. 高斯朴素贝叶斯(GaussianNB)
适合连续型数据,比如身高、体重这种具体的数字。老师说如果用多项式模型处理连续数据,误差会很大,而高斯模型会假设数据服从 “正态分布”,通过计算均值和方差来算概率。
调用的时候用 GaussianNB,参数 “priors” 可以自己设定先验概率,如果不设,模型会根据数据自动算。
3. 伯努利朴素贝叶斯(BernoulliNB)
适合二值化数据(只有 0 和 1),比如文本分类里 “某个单词是否出现”(出现为 1,不出现为 0)。
参数里除了 alpha,还有个 “binarize”—— 用来设定二值化的阈值,比如设为 0.5,大于 0.5 的数变成 1,小于的变成 0;如果数据已经是 0 和 1 了,就设为 None。
最后老师还留了个课堂练习:用朴素贝叶斯做手写数字识别,数据从 sklearn 的 load_digits 里调。虽然还没完全做完,但已经能感觉到朴素贝叶斯的优势 —— 计算快、对数据量要求不高,还能解决很多实际问题。
四、总结:朴素贝叶斯的 “简单” 与 “实用”
今天学下来最大的感受是,朴素贝叶斯没有复杂的数学推导,核心就是 “贝叶斯公式 + 朴素假设”。虽然 “特征独立” 的假设不完全符合现实,但它胜在简单、高效,而且在文本分类、拼写纠正、垃圾识别这些场景里表现特别好。
对于刚入门机器学习的我来说,这种 “从实际问题出发,用简单假设解决复杂问题” 的思路,比死记公式更有启发。接下来打算把手写数字识别的练习做完,再试试用它给朋友的邮件做个简单的垃圾过滤 —— 毕竟能把学到的东西用起来,才是真的学会了~