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 个特征分别是:
- 花萼长度
- 花萼宽度
- 花瓣长度
- 花瓣宽度
模型要做的事情,就是根据这些特征,判断当前样本属于哪一种鸢尾花。
所以这本质上是一个三分类任务。
下面这段代码做的事情很直观:
- 准备几个不同的分类器
- 让它们分别学习
- 再把它们的结果综合起来
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)常见组合方法有哪些?
- 装袋
- 提升
- 随机森林
十二、结尾总结
这一篇文章主要回答的是一个很自然的问题:
如果一个模型判断得不够稳,怎么办?
答案就是:
不要只依赖一个模型,可以让多个模型一起判断。
顺着这个问题,我们也把组合分类最核心的思想捋清楚了:
- 组合分类不是简单堆模型
- 它的目标是提高整体分类效果和总体准确率
- 常见方法包括装袋、提升和随机森林
- 多个模型一起判断之所以可能更稳,是因为它们之间可能形成互补
- 但组合并不等于一定更好,关键还是看组合机制是否合理
如果说前面学的是:
- 一个模型怎么做判断
那么这一篇学的就是:
多个模型为什么一起判断,往往会更稳。
把这个组合思想建立起来,后面再继续学随机森林,就会自然很多。
十三、课后思考
可以试着回答下面几个问题:
- 为什么单个分类器的结果有时不够稳定?
- 为什么多个模型一起判断可能更可靠?
- 组合分类为什么不等于“简单堆模型”?
- 装袋、提升、随机森林分别是什么思路?
- 为什么说组合分类的关键在于组合规则,而不只是模型数量?
如果这些问题都能比较顺畅地说清楚,那这一篇的核心内容就已经真正理解了。
写在最后
组合分类这部分内容,第一次学的时候最容易出现一个误区:
觉得它只是“把多个模型放在一起”。
其实真正重要的,不是模型数量变多了,而是:
多个模型如何在一定规则下协同工作,把结果做得更稳。
所以这一篇先把“组合思想”建立起来,后面再学随机森林、装袋、提升这些方法时,就会顺很多。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)