Python 数据分析入门:从概率角度做分类,一文认识朴素贝叶斯
适合人群:Python 初学者 / 数据分析入门 / 机器学习入门 / 教学案例分享
前面几篇文章里,我们已经陆续认识了几种很有代表性的分类方法:
- K近邻:看新样本和谁最像
- 决策树:像老师一样一步步做判断
- 随机森林:一棵树不够稳,那就很多棵树一起判断
到了这里,再往下学,就会碰到另一类非常有代表性的方法:
从"概率"角度做分类。
这就是今天这篇文章要讲的内容:
朴素贝叶斯(Naive Bayes)
第一次看到这个名字,很多人会有点发怵。
主要原因有两个:
- 听起来像数学味很重
- "贝叶斯"这个词很容易让人联想到公式
其实入门阶段完全不用紧张。
你可以先把朴素贝叶斯理解成一句非常直白的话:
根据一个样本已经表现出来的特征,去估计它最有可能属于哪一类。
还是拿"学生能否通过技能考核"这个案例来说:
- 一个学生平时成绩较高
- 实训成绩也不错
- 出勤率比较稳定
- 还参加过培训
那你自然会觉得:
这个学生最后"通过"的概率,应该更大。
这其实就是朴素贝叶斯最核心的出发点:
比较它属于各个类别的可能性,谁的概率更大,就判给谁。
这一篇文章,我会继续沿用"学生职业技能考核通过预测"这个统一案例,把朴素贝叶斯讲清楚:
- 朴素贝叶斯到底在做什么
- 为什么它叫"朴素"
- 它和前面学过的分类方法有什么不同
- 它的核心思想怎么通俗理解
- 高斯朴素贝叶斯是什么
- 如何用 Python 完成一个简单的朴素贝叶斯分类任务
一、先从一个很自然的问题开始:这个学生"更可能"属于哪一类?
前面学 K近邻的时候,我们的思路是:
看这个学生和谁最像。
学决策树的时候,我们的思路是:
一步一步问问题,看最后走到哪一类。
而朴素贝叶斯换了一个思路,它问的是:
在已知这些特征的情况下,这个学生属于"通过"这类的概率大,还是属于"未通过"这类的概率大?
比如现在有一个学生:
- 平时成绩高
- 出勤率高
- 参加过培训
那很自然就会想到:
- 如果过去"通过"的学生里,也经常出现这些特征
- 那这个新学生也更可能属于"通过"这一类
这就是概率分类的基本直觉。
所以朴素贝叶斯最适合先这样理解:
它不是先找邻居,也不是先画树,而是在比较"属于各个类别的可能性"。
二、什么是朴素贝叶斯?
朴素贝叶斯是一类基于贝叶斯定理 的分类方法。
不过入门阶段,真的没必要一开始就被公式吓住。
你可以先抓住它最核心的事情:
给定一个样本的特征,分别计算它属于每个类别的可能性,最后把它分到概率最大的那一类。
比如还是"学生是否通过技能考核"的问题:
现在来了一个新学生,已知他:
- 平时成绩不错
- 出勤率高
- 实训成绩也可以
那模型会分别去想:
- 他属于"通过"的可能性有多大?
- 他属于"未通过"的可能性有多大?
最后谁更大,就判给谁。
所以你可以把朴素贝叶斯先理解成一句简单的话:
它是一种"按概率选类别"的分类方法。
三、为什么叫"朴素"贝叶斯?
这个名字其实特别值得解释一下。
因为"贝叶斯"本身已经挺学术了,前面还加了个"朴素",很多人第一次看会更迷糊。
这里的"朴素",说白了就是:
它做了一个比较强、比较简单的假设。
这个假设就是:
在给定类别的情况下,各个特征之间相互独立。
第一次看这句话,可能还是会觉得抽象。
没关系,我们继续用学生案例来理解。
四、什么叫"给定类别下特征独立"?
假设现在我们只看"通过"这一类学生。
朴素贝叶斯会做一个简化假设:
- 平时成绩高不高
- 出勤率高不高
- 是否参加培训
这些特征在"已知这个学生属于通过类"的前提下,可以先当成彼此独立来看。
说白了就是:
它先假设这些特征不会互相影响。
比如:
- 一个学生成绩高
- 不代表在模型里,出勤率一定也要高
- 是否参加培训,也先不和其他特征捆在一起考虑
这个假设在现实里未必完全成立。
因为真实情况下,这些特征往往不是完全独立的。
比如:
- 成绩高的学生,可能出勤率也更高
- 参加培训的学生,实训成绩可能更好
但朴素贝叶斯为了把问题变得简单、可计算,就先做了这样一个"朴素假设"。
所以这个名字的意思其实就是:
贝叶斯方法 + 一个很朴素的独立性假设
这就是"朴素贝叶斯"名字的由来。
五、朴素贝叶斯到底在做什么?一句话解释核心流程
如果把朴素贝叶斯的流程压缩成一句话,那就是:
针对每个类别,分别计算"这个样本属于它的可能性",然后选概率最大的类别。
还是用学生案例来理解。
假设现在有一个新学生:
- 平时成绩高
- 出勤率高
- 参加过培训
那模型会分别算:
- 在"通过"这类学生中,出现这些特征的可能性大不大?
- 在"未通过"这类学生中,出现这些特征的可能性大不大?
如果第一种可能性更大,那就判为"通过";
如果第二种更大,那就判为"未通过"。
所以朴素贝叶斯最本质的逻辑就是:
分别站在每个类别的角度,看这个样本"像不像"这一类。
只不过它判断"像不像"的方式,不是靠距离,而是靠概率。
六、它和前面学过的方法,有什么明显区别?
学到这里,很多人会问:
- KNN 也能分类
- 决策树也能分类
- 随机森林也能分类
那朴素贝叶斯到底不一样在哪?
其实差别非常明显。
K近邻
核心思路是:
看谁和新样本最像。
它更强调"距离"和"邻居"。
决策树
核心思路是:
一步一步问问题,最后走到某个结果。
它更强调"条件判断"。
随机森林
核心思路是:
很多棵树一起判断,减少单棵树的不稳定。
它更强调"组合判断"。
朴素贝叶斯
核心思路是:
比较样本属于各个类别的概率,谁更大就分给谁。
它更强调"概率推断"。
所以可以用一句话来区分:
KNN 看相似,决策树看规则,朴素贝叶斯看概率。
七、贝叶斯分类为什么适合做分类?
因为分类这件事,本质上就是在问:
这个样本到底更应该属于哪一类?
而朴素贝叶斯刚好非常直接地回答了这个问题:
- 你属于 A 类的概率大不大?
- 你属于 B 类的概率大不大?
- 哪个更大,就选哪个
所以它其实是一种很自然的分类思路。
从方法本身来看,贝叶斯分类是一类以贝叶斯定理为基础、采用概率推理方法进行分类的算法。
这类方法的好处在于:
- 思路清晰
- 分类逻辑直接
- 很适合从"概率角度"理解分类问题
八、什么是高斯朴素贝叶斯?
在实际使用里,朴素贝叶斯还有不同类型。
其中最常见、也最适合入门数值型数据的是:
高斯朴素贝叶斯(Gaussian Naive Bayes)
为什么叫"高斯"?
因为它默认数值型特征在每个类别下,近似服从高斯分布,也就是常说的正态分布。
如果你第一次接触,不需要马上深究分布公式。
先记住一点就够了:
当特征是连续数值时,常常可以先用高斯朴素贝叶斯来做分类。
比如:
- 平时成绩
- 实训成绩
- 出勤率
这些都是数值型特征,就比较适合先用高斯朴素贝叶斯来尝试。
除了高斯朴素贝叶斯以外,常见的还有:
- 多项式朴素贝叶斯
- 伯努利朴素贝叶斯
但入门阶段,先把高斯朴素贝叶斯理解清楚就够了。
九、回到案例:朴素贝叶斯怎么判断学生能否通过考核?
还是用这个统一案例。
假设现在有一个新学生:
- 平时成绩高
- 实训成绩高
- 出勤率高
那朴素贝叶斯会分别去看两件事:
第一件事:如果这个学生属于"通过"类,这些特征常见吗?
如果在历史数据里,"通过"的学生通常都具备:
- 成绩较高
- 实训较好
- 出勤稳定
那这个新学生属于"通过"的可能性就会上升。
第二件事:如果这个学生属于"未通过"类,这些特征常见吗?
如果在历史数据里,"未通过"的学生通常不具备这些特征,那这个新学生属于"未通过"的可能性就会下降。
最后把这两个结果一比较,就能做出分类判断。
所以朴素贝叶斯的判断方式,其实很像:
站在每个类别的角度,反过来看这个样本出现得是否合理。
十、Python 实操之前,先说一下用的数据是什么
下面代码里依然使用 sklearn 自带的 鸢尾花数据集(Iris)。
这个数据集非常经典,包含:
- 150 个样本
- 4 个数值特征
- 3 个类别
4 个特征分别是:
- 花萼长度
- 花萼宽度
- 花瓣长度
- 花瓣宽度
模型要做的事情,就是根据这 4 个特征,判断一朵花属于哪一种鸢尾花。
所以这是一个标准的三分类任务。
这里继续用它,不是因为它和"学生能否通过考核"业务完全一样,而是因为它非常适合演示分类模型的基本用法。
十一、Python 实操:用高斯朴素贝叶斯做一个三分类任务
下面直接使用 GaussianNB() 来完成一个简单分类。
python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
# 1. 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3. 构建高斯朴素贝叶斯模型
nb = GaussianNB()
# 4. 训练模型
nb.fit(X_train, y_train)
# 5. 查看模型效果
print("测试准确率:", nb.score(X_test, y_test))
十二、这段代码在做什么?
这段代码整体非常清楚,适合初学者理解。
第一步:加载数据
这里加载的是鸢尾花数据集:
X是特征y是类别标签
第二步:划分训练集和测试集
还是老思路:
- 一部分数据拿来训练
- 一部分数据拿来测试
这样可以更客观地看模型在新数据上的表现。
第三步:创建模型
这里最关键的一行是:
python
nb = GaussianNB()
这表示我们使用的是:
高斯朴素贝叶斯分类器
它适合处理数值型特征。
第四步:训练模型
fit() 的作用就是让模型根据训练数据学习各类别下的特征分布。
第五步:输出准确率
score() 会返回模型在测试集上的分类准确率。
所以从整体上看,这段代码完成的事情就是:
用高斯朴素贝叶斯模型,去完成一个三分类任务。
十三、朴素贝叶斯有什么优点?
朴素贝叶斯之所以经典,不只是因为它名字常见,而是因为它确实有一些很实用的优点。
1)思路清晰
它做的事情非常明确:
- 计算属于各类别的可能性
- 最后选概率最大的类别
这比很多"黑盒模型"更容易从逻辑上理解。
2)实现简单
无论从原理还是从代码层面看,它都比较简洁。
3)在很多问题上效果并不差
虽然它做了"特征独立"这种看起来有点理想化的假设,但在很多实际任务中,它依然能取得不错的分类效果。
十四、朴素贝叶斯的局限在哪?
当然,它也不是完美的。
最大的特点,也是它最大的局限:
它假设特征在给定类别下是相互独立的。
这个假设在真实世界里往往不完全成立。
比如在学生案例里:
- 平时成绩高的学生,出勤率可能也更高
- 参加培训的学生,实训成绩可能也更好
这些特征显然有可能互相影响。
所以朴素贝叶斯的问题就在于:
为了让模型简单可用,它把现实中的复杂关系做了简化。
这就是为什么它叫"朴素"。
不过也正因为这种简化,它才具备了:
- 思路简单
- 计算直接
- 容易实现
这些优点。
十五、这一篇最该记住什么?
学完这一篇,建议至少记住下面几个核心点。
1)什么是朴素贝叶斯?
一种基于概率推理的分类方法。
2)它到底在做什么?
比较样本属于各个类别的概率,谁更大就分给谁。
3)为什么叫"朴素"?
因为它假设在给定类别下,各个特征之间相互独立。
4)它和前面的方法有什么不同?
- KNN:看相似
- 决策树:看规则
- 随机森林:看多树组合
- 朴素贝叶斯:看概率
5)高斯朴素贝叶斯适合什么情况?
适合处理数值型特征的分类任务。
十六、结尾总结
这一篇文章,核心就是想把一个问题讲明白:
除了"看谁最像"和"一步步做判断",还能不能从概率角度做分类?
答案就是:
可以,这就是朴素贝叶斯的基本思想。
顺着这个问题,我们可以得到几个很重要的认识:
- 朴素贝叶斯是一种基于贝叶斯定理的分类方法
- 它的核心思路是比较样本属于各类别的可能性
- 它之所以叫"朴素",是因为做了特征独立的简化假设
- 对于数值型数据,常见做法是使用高斯朴素贝叶斯
- 它和 KNN、决策树、随机森林代表了很不一样的分类思路
如果前面几篇文章更多是在建立:
- 相似性分类思维
- 规则分类思维
- 组合分类思维
那么这一篇文章建立的就是:
概率分类思维。
这一步想清楚以后,后面继续看支持向量机,就会更容易感受到:
同样是分类问题,不同算法其实是在用完全不同的视角看问题。
十七、课后思考
可以试着回答下面几个问题:
- 朴素贝叶斯为什么是一种"概率分类"方法?
- 它为什么叫"朴素"?
- 什么叫"给定类别下特征独立"?
- 高斯朴素贝叶斯适合处理什么类型的数据?
- 朴素贝叶斯和 KNN、决策树在思路上最大的区别是什么?
如果这些问题你都能比较顺畅地说清楚,那这一部分就已经真正入门了。
写在最后
朴素贝叶斯这类方法,第一次看名字容易觉得"数学味太重",
但真正理解以后,会发现它其实非常直接:
不是去找邻居,也不是去画树,而是直接比较"这个样本更像哪一类的概率"。
所以如果你已经把这篇文章读明白了,那你对分类问题的理解就已经更完整了一步。
接下来继续往下学支持向量机时,你会更清楚地看到:
分类方法之间最大的差别,不只是代码长得不同,而是它们看问题的方式本身就不同。