26 Python 分类:一个模型不够稳怎么办?一文认识组合分类

Python 数据分析入门:一个模型不够稳怎么办?一文认识组合分类

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

前面几篇文章里,我们已经陆续认识了几种常见的分类方法:

  • K近邻:看谁和新样本更像
  • 决策树:像老师一样一步步做判断
  • ID3、C4.5、CART:决定树该怎么分
  • 剪枝:防止树长得太复杂

学到这里,很多人会自然冒出一个问题:

如果单个模型判断得不够稳,有没有办法让结果更可靠一点?

比如还是"学生能否通过技能考核"这个案例。

有时候,一个模型在当前这批数据上效果还不错,但换一批数据,结果就会有波动。

这说明什么?

说明:

单个分类器,可能会受样本波动、噪声和局部数据分布的影响。

这时候,一个很自然的想法就出现了:

  • 如果一个模型不够稳
  • 能不能让多个模型一起判断?
  • 多个模型综合起来,会不会比单独一个更靠谱?

这正是这一篇文章要讲的内容:

组合分类(Ensemble Classification)

从基本思想上看,组合方法是通过学习和组合一系列个体分类器,来提高整体分类效果和总体准确率的。

常见的组合方法包括:

  • 装袋(Bagging)
  • 提升(Boosting)
  • 随机森林(Random Forest)

不过先别急着记这些名字。

这一篇文章最重要的任务,不是一下子把所有集成算法细节都学完,而是先建立一个清晰认识:

为什么多个模型一起判断,有时候会更稳?


一、先从一个很生活化的问题开始:一个老师判断,和多个老师判断,哪个更稳?

还是回到"学生能否通过技能考核"这个例子。

如果只让一个老师根据经验来判断,可能会出现什么情况?

  • 老师经验有限
  • 老师可能特别看重某一个方面
  • 数据一变,判断结果也可能跟着波动

比如:

  • 有的老师特别看重实训成绩
  • 有的老师更重视出勤率
  • 有的老师会把培训经历看得更重要

这说明:

一个人的判断,可能带有局部性。

那如果换一种方式:

  • 不是只让一个老师判断
  • 而是让多个老师分别判断
  • 最后综合大家的意见

通常会发生什么?

很多时候,结果会更稳一些。

因为:

  • 某一个人的偏差,可能被别人拉回来
  • 某一个人的误判,不至于直接决定最终结果
  • 多个人综合后,偶然性通常会下降

这其实就是组合分类最容易理解的起点。

所以你可以先把组合分类理解成一句很直白的话:

一个模型可能会看偏,那就让多个模型一起来判断。


二、什么是组合分类?

组合分类,说白了就是:

把多个分类器组合起来,让它们共同完成分类任务。

这里的关键,不是"多放几个模型"这么简单,而是:

通过多个模型共同决策,提高整体分类效果。

这个定义里有两个词特别重要:

  • 个体分类器
  • 组合

1)什么是个体分类器?

个体分类器,就是一个单独的模型。

比如:

  • 一棵决策树
  • 一个 K近邻模型
  • 一个支持向量机模型

这些都可以单独做分类。

2)什么叫组合?

组合,就是不只看某一个模型的结果,而是把多个模型的结果综合起来,再给出最终判断。

所以组合分类最核心的意思就是:

不是一个模型说了算,而是多个模型一起决定。


三、为什么多个模型一起判断,往往会更稳?

这是组合分类里最核心的问题。

很多人第一次接触这部分内容时,最自然的疑问就是:

为什么多个模型一起判断,就可能更好?

这个问题可以从两个角度来理解。


1)单个模型容易受数据波动影响

再好的模型,也是在当前这批训练数据上学出来的。

如果这批数据里刚好有:

  • 噪声
  • 异常点
  • 分布不均衡
  • 偶然样本

那模型就可能被"带偏"。

比如一棵决策树,就可能因为几个特殊样本长出一些不太稳定的分支。

这也是为什么前面讲决策树时,会专门提到过拟合和剪枝。

所以单个模型的问题可以简单理解成:

它可能把当前数据的局部特征看得太重。


2)多个模型组合后,可以降低偶然性

如果不是只用一个模型,而是让多个模型分别学习、分别判断,再把它们的结果合起来,那很多时候结果会更稳一些。

为什么?

因为:

  • 某个模型判断失误,不代表所有模型都会一起失误
  • 某个模型特别偏,也可能被其他模型的结果中和掉
  • 多个模型的差异,反而可能成为一种互补

这就像集体决策:

  • 一个人可能看走眼
  • 但多个人一起判断,通常不容易完全跑偏

所以组合分类最重要的直觉就是:

多个模型不一定每个都完美,但组合起来,往往能降低单个模型的偶然偏差。


四、但要注意:组合分类并不是"模型越多越好"

这一点很重要,而且特别值得单独说清楚。

很多人一开始会误以为:

只要模型够多,效果肯定更好。

其实不是。

组合分类如果弄不好,结果也可能更差。

为什么?

1)如果基础模型都很差,组合起来也未必会变好

如果每个个体分类器本身判断能力就很弱,那把它们放在一起,不会自动变强。

换句话说:

组合方法不是"点石成金"。

它更像是:

把几个还不错、但各有偏差的模型,想办法组合得更稳。


2)如果这些模型太像,组合意义也会变小

如果所有模型都学到了差不多的东西、犯的也是差不多的错误,那把它们组合起来,提升就有限。

组合之所以可能有效,往往是因为模型之间存在一定差异,能够互相补充。


3)如果组合规则不合理,结果也可能被带偏

这也是非常关键的一点。

如果组合方式本身不合理,比如:

  • 明显不靠谱的模型和靠谱模型拥有同样话语权
  • 每个模型的结果都被机械平均
  • 模型之间根本没有形成互补

那最后结果不一定更好。

所以组合分类真正的关键,不在于"模型数量多",而在于:

这些模型是怎么生成的、怎么组合的、最后按什么规则协同决策。

这也是为什么组合方法强调的是"有策略地组合",而不是"简单叠加"。


五、组合分类是不是"简单堆模型"?

不是。

这也是最容易产生误解的地方。

很多人一开始会把组合方法理解成:

"不就是把好几个模型放在一起吗?"

如果只是机械地堆几个模型,当然谈不上真正的组合学习。

组合分类强调的不是"数量",而是:

  • 这些模型怎么来
  • 它们之间有没有差异
  • 最后怎么把结果合起来

所以更准确一点地说:

组合分类不是简单堆模型,而是一种有明确生成规则和组合规则的方法。

这句话非常重要,因为它能帮你把"组合分类"和"模型凑数"彻底区分开。


六、组合分类里最常见的几种思路

在分类任务中,比较常见的组合方法主要包括:

  • 装袋(Bagging)
  • 提升(Boosting)
  • 随机森林(Random Forest)

这一篇文章先不深入讲每种方法的数学细节,而是先建立整体感觉。


1)装袋:让多个模型各自学习,再综合结果

装袋的核心思路可以理解成:

从原始训练数据中反复抽样,训练出多个模型,然后把这些模型的结果综合起来。

重点在于:

  • 每个模型看到的数据不完全一样
  • 所以学出来的判断也会有差异
  • 最后再把这些差异化模型的结果综合起来

这种方法的好处是:

可以降低单个模型因为样本波动带来的不稳定。


2)提升:让后面的模型重点纠正前面的错误

提升的思路和装袋不太一样。

它更像是:

前面的模型先做判断,后面的模型重点去纠正前面分错的地方。

所以它不是"大家平行判断",而更像"前后接力改错"。

你可以把它理解成:

  • 第一个模型先答题
  • 第二个模型重点看前面哪些题做错了
  • 第三个模型继续补前面没解决好的地方

它强调的是:

不断修正错误,逐步把整体结果做得更好。


3)随机森林:很多棵树一起投票

随机森林是组合方法里非常典型、也非常常见的一种。

它的基本思路就是:

不是只用一棵决策树,而是用很多棵决策树一起判断。

你可以先这样理解:

  • 一棵树可能会长偏
  • 那就不要只相信一棵树
  • 让很多棵树分别判断
  • 最后综合大家的结果

所以随机森林本质上就是:

组合分类思想 + 决策树

后面单独讲随机森林的时候,再展开讲它为什么通常会比单棵树更稳。


七、组合方法为什么能提高总体准确率?

组合方法的目标,本来就是提高整体分类效果和总体准确率。

但它能做到这一点,并不是因为"模型数量变多了",而是因为两个更关键的原因。

第一,个体模型通常不是完全一样的

如果所有模型都一模一样、训练方式也完全一样,那组合意义其实不大。

组合方法通常会设法让模型之间产生一定差异,比如:

  • 看到的训练数据不同
  • 关注的错误不同
  • 学出来的边界不同

这样它们的判断就不会完全重合。

第二,综合判断可以起到互相补充的作用

当多个模型各自有一点优点、也各自有一点偏差时,组合起来,常常会出现这样的效果:

  • 某个模型的偏差被其他模型抵消掉
  • 某些错误不会被一直放大
  • 总体判断比单个模型更稳

所以更准确地说,组合方法的价值在于:

通过有策略地学习和组合多个个体分类器,让模型之间形成互补。


八、先建立一个框架:单模型 vs 组合模型

学到这里,先把一个整体框架记住特别重要。

单模型

前面学过的这些,大多都可以看作单模型:

  • K近邻
  • 决策树
  • 支持向量机
  • 朴素贝叶斯

它们都是一个模型单独做判断。

组合模型

而组合分类的思路是:

不再只依赖一个模型,而是让多个模型共同做判断。

所以可以把这部分理解成分类学习中的一个"升级":

  • 前面:一个模型做判断
  • 现在:多个模型协同判断

这个框架一旦建立起来,后面学随机森林就会顺很多。


九、Python 实操:先用一个简单的投票分类器建立直觉

这部分先不急着上复杂的集成算法。

最适合入门的方式,是先用一个"投票分类器"建立感觉。

这里用的是 sklearn 自带的 鸢尾花数据集(Iris)

这是一个非常经典的机器学习入门分类数据集,一共包含:

  • 150 条样本
  • 4 个数值特征
  • 3 个类别

这 4 个特征分别是:

  • 花萼长度
  • 花萼宽度
  • 花瓣长度
  • 花瓣宽度

模型要做的事情,就是根据这些特征,判断当前样本属于哪一种鸢尾花。

所以这本质上是一个三分类任务

下面这段代码做的事情很直观:

  • 准备几个不同的分类器
  • 让它们分别学习
  • 再把它们的结果综合起来
python 复制代码
from sklearn.ensemble import VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 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. 定义三个基础分类器
clf1 = DecisionTreeClassifier(random_state=42)
clf2 = KNeighborsClassifier(n_neighbors=3)
clf3 = SVC(probability=True, random_state=42)

# 4. 构造投票分类器
voting = VotingClassifier(
    estimators=[('dt', clf1), ('knn', clf2), ('svc', clf3)],
    voting='soft'
)

# 5. 训练模型
voting.fit(X_train, y_train)

# 6. 输出准确率
print("投票分类器准确率:", voting.score(X_test, y_test))

十、这段代码到底在做什么?

这段代码非常适合用来建立"组合分类"的第一直觉。

第一步:准备三个不同的分类器

这里用了:

  • 决策树
  • K近邻
  • 支持向量机

这三个模型本来都可以单独完成分类任务。

第二步:把它们放进一个投票分类器里

VotingClassifier 的作用就是:

把多个分类器组合起来,最终通过投票的方式给出结果。

也就是说,它不再只听一个模型的,而是综合多个模型的判断。

第三步:voting='soft' 是什么意思?

这里用的是软投票

软投票可以先简单理解成:

不仅看每个模型投给了哪一类,还会参考它对各类别的概率判断。

如果你是初学者,这里不需要一下子深究软投票和硬投票的全部区别。

先记住一点就够了:

这段代码展示的是"多个模型一起做判断"的基本思路。


十一、这一篇最该记住什么?

学完这一篇,最重要的是先建立组合分类的整体感觉。

建议至少记住下面几件事。

1)什么是组合分类?

把多个分类器组合起来,让它们共同完成分类任务。

2)为什么要组合?

因为单个模型可能会有偏差,多个模型一起判断通常更稳。

3)组合分类一定会更好吗?

不一定。

如果个体模型太差、彼此太相似,或者组合方式不合理,组合效果也可能变差。

4)组合方法真正的关键是什么?

不是模型数量多,而是这些模型如何生成、如何组合,以及最终按什么规则协同决策。

5)常见组合方法有哪些?

  • 装袋
  • 提升
  • 随机森林

十二、结尾总结

这一篇文章主要回答的是一个很自然的问题:

如果一个模型判断得不够稳,怎么办?

答案就是:

不要只依赖一个模型,可以让多个模型一起判断。

顺着这个问题,我们也把组合分类最核心的思想捋清楚了:

  • 组合分类不是简单堆模型
  • 它的目标是提高整体分类效果和总体准确率
  • 常见方法包括装袋、提升和随机森林
  • 多个模型一起判断之所以可能更稳,是因为它们之间可能形成互补
  • 但组合并不等于一定更好,关键还是看组合机制是否合理

如果说前面学的是:

  • 一个模型怎么做判断

那么这一篇学的就是:

多个模型为什么一起判断,往往会更稳。

把这个组合思想建立起来,后面再继续学随机森林,就会自然很多。


十三、课后思考

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

  1. 为什么单个分类器的结果有时不够稳定?
  2. 为什么多个模型一起判断可能更可靠?
  3. 组合分类为什么不等于"简单堆模型"?
  4. 装袋、提升、随机森林分别是什么思路?
  5. 为什么说组合分类的关键在于组合规则,而不只是模型数量?

如果这些问题都能比较顺畅地说清楚,那这一篇的核心内容就已经真正理解了。


写在最后

组合分类这部分内容,第一次学的时候最容易出现一个误区:

觉得它只是"把多个模型放在一起"。

其实真正重要的,不是模型数量变多了,而是:

多个模型如何在一定规则下协同工作,把结果做得更稳。

所以这一篇先把"组合思想"建立起来,后面再学随机森林、装袋、提升这些方法时,就会顺很多。

相关推荐
左左右右左右摇晃2 小时前
Java笔记——多态
java·笔记·python
qyzm2 小时前
天梯赛练习题
数据结构·python·算法·贪心算法
爱编程的小吴2 小时前
LangChain基础入门:DocumentLoader加载PDF/Markdown文档实战
python·langchain·pdf
清水白石0082 小时前
协程不是线程:深入理解 Python async/await 运行机制
java·linux·python
阿贵---2 小时前
如何为开源Python项目做贡献?
jvm·数据库·python
NGC_66112 小时前
详解Java包装类
开发语言·windows·python
暮冬-  Gentle°2 小时前
用Python破解简单的替换密码
jvm·数据库·python
写点什么呢2 小时前
Pytorch学习16_损失函数与反向传播
人工智能·pytorch·python·学习·pycharm