27 Python 分类-从概率角度做分类,一文认识朴素贝叶斯

Python 数据分析入门:从概率角度做分类,一文认识朴素贝叶斯

适合人群:Python 初学者 / 数据分析入门 / 机器学习入门 / 教学案例分享

前面几篇文章里,我们已经陆续认识了几种很有代表性的分类方法:

  • K近邻:看新样本和谁最像
  • 决策树:像老师一样一步步做判断
  • 随机森林:一棵树不够稳,那就很多棵树一起判断

到了这里,再往下学,就会碰到另一类非常有代表性的方法:

从"概率"角度做分类。

这就是今天这篇文章要讲的内容:

朴素贝叶斯(Naive Bayes)

第一次看到这个名字,很多人会有点发怵。

主要原因有两个:

  1. 听起来像数学味很重
  2. "贝叶斯"这个词很容易让人联想到公式

其实入门阶段完全不用紧张。

你可以先把朴素贝叶斯理解成一句非常直白的话:

根据一个样本已经表现出来的特征,去估计它最有可能属于哪一类。

还是拿"学生能否通过技能考核"这个案例来说:

  • 一个学生平时成绩较高
  • 实训成绩也不错
  • 出勤率比较稳定
  • 还参加过培训

那你自然会觉得:

这个学生最后"通过"的概率,应该更大。

这其实就是朴素贝叶斯最核心的出发点:

比较它属于各个类别的可能性,谁的概率更大,就判给谁。

这一篇文章,我会继续沿用"学生职业技能考核通过预测"这个统一案例,把朴素贝叶斯讲清楚:

  • 朴素贝叶斯到底在做什么
  • 为什么它叫"朴素"
  • 它和前面学过的分类方法有什么不同
  • 它的核心思想怎么通俗理解
  • 高斯朴素贝叶斯是什么
  • 如何用 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、决策树、随机森林代表了很不一样的分类思路

如果前面几篇文章更多是在建立:

  • 相似性分类思维
  • 规则分类思维
  • 组合分类思维

那么这一篇文章建立的就是:

概率分类思维。

这一步想清楚以后,后面继续看支持向量机,就会更容易感受到:

同样是分类问题,不同算法其实是在用完全不同的视角看问题。


十七、课后思考

可以试着回答下面几个问题:

  1. 朴素贝叶斯为什么是一种"概率分类"方法?
  2. 它为什么叫"朴素"?
  3. 什么叫"给定类别下特征独立"?
  4. 高斯朴素贝叶斯适合处理什么类型的数据?
  5. 朴素贝叶斯和 KNN、决策树在思路上最大的区别是什么?

如果这些问题你都能比较顺畅地说清楚,那这一部分就已经真正入门了。


写在最后

朴素贝叶斯这类方法,第一次看名字容易觉得"数学味太重",

但真正理解以后,会发现它其实非常直接:

不是去找邻居,也不是去画树,而是直接比较"这个样本更像哪一类的概率"。

所以如果你已经把这篇文章读明白了,那你对分类问题的理解就已经更完整了一步。

接下来继续往下学支持向量机时,你会更清楚地看到:

分类方法之间最大的差别,不只是代码长得不同,而是它们看问题的方式本身就不同。

相关推荐
2301_776508722 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2401_879693872 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
I'm Jie2 小时前
Swagger UI 本地化部署,解决 FastAPI Swagger UI 依赖外部 CDN 加载失败问题
python·ui·fastapi·swagger·swagger ui
一招定胜负3 小时前
基于通义千问 API 的课堂话语智能分类分析工具实现
人工智能·分类·数据挖掘
2401_846341653 小时前
Python Lambda(匿名函数):简洁之道
jvm·数据库·python
2401_879693873 小时前
进阶技巧与底层原理
jvm·数据库·python
阿_旭3 小时前
基于YOLO26深度学习的【桃子成熟度检测与分割系统】【python源码+Pyqt5界面+数据集+训练代码】图像分割、人工智能
人工智能·python·深度学习·桃子成熟度检测
蹦哒3 小时前
Kotlin 与 Java 语法差异
java·python·kotlin
jerryinwuhan3 小时前
python数据挖掘基础
python·数据挖掘·numpy