CHAPTER 28 / 37
树木组合:为什么一棵树不可靠,但一片森林可以?
复杂系统的答案,从来不是来自一次完美决策,而是来自无数次不完美判断的叠加。
在前面的两篇文章中,我们已经理解了两件事情:
第一,决策树是一种非常直观的模型。它像流程图一样,一步一步做判断。第二,决策树是通过不断分裂数据长出来的。它会选择最有信息量的问题,一直分下去,直到不需要再分。
但在真实项目中,很快就会遇到一个问题:一棵树,其实并不稳定。甚至可以说:它有点“情绪化”。只要数据发生一点点变化,它可能就会做出完全不同的决策。
而这,就是今天这篇文章要解决的问题。
为什么同一份数据,模型会突然变?
假设你在做一个用户是否会续费会员的预测模型。你的数据大概是这样:
你训练了一棵决策树,得到:
是否使用过优惠券?
↓
是 / 否这看起来很合理。但现在发生了一件很小的变化——新增了一条数据:
最近登录:是
使用优惠券:否
浏览课程:是
结果:续费结果你重新训练模型,突然发现:
是否浏览过课程?
↓
是 / 否变成了新的根节点。
整棵树,完全变了,这不是 Bug,这是决策树的一个天然特性:它对数据非常敏感。哪怕只改变一条数据,也可能产生完全不同的结构。
工程上的解决方案:不要用一棵树
既然一棵树不稳定,那么怎么办? 答案非常简单:不要依赖一棵树,而是让很多棵树一起投票。这就是树木组合(Tree Ensemble)。
假设现在有 3 棵树:
Tree 1 → 预测:会续费
Tree 2 → 预测:不会续费
Tree 3 → 预测:会续费最终结果——多数投票:会续费。
这就像一个评审委员会,不是一个人决定,而是集体决策。
这样做的好处非常直接——单个模型的错误,会被整体平均掉。
第一种方法:Bagging(装袋法)
这是最基础的一种树组合方法。
它的核心思想非常简单:用不同的数据,训练很多棵树。关键技术是有放回抽样(Sampling with Replacement)。
这个名字听起来很学术,但其实非常直观。
假设你有10个用户样本,你要重新生成一份新的训练数据。
你不是复制一遍,而是:
随机抽一个用户
放回去
再抽一个
再放回去直到抽满 10 次。结果可能变成:
用户A
用户C
用户C
用户F
用户A
用户D
用户H
用户B
用户B
用户E你会发现有些用户出现两次,有些用户没出现,这正是有放回抽样。
它的作用是:生成很多“略微不同”的数据集。然后每个数据集训练一棵树,这就形成一组树。这种方法叫:Bagged Decision Tree 或者 Bagging。
一个典型流程如下:
原始数据集
↓
随机采样数据集1 → 训练树1
随机采样数据集2 → 训练树2
随机采样数据集3 → 训练树3
↓
投票通常 100 棵树就已经非常有效。
第二种方法:Random Forest(随机森林)
Bagging已经很好了,但工程师又发现一个问题:很多树,还是太像了。
例如: 如果一个特征特别强,比如用户是否有历史订单,那几乎所有树都会选它作为第一层。结果是,100 棵树 长得几乎一样,这样就失去了“多样性”。
于是引入了一个非常聪明的改进:每次分裂时,不允许看所有特征。而是只允许看一小部分。
假设有20个特征,现在规定:每次只能随机选 4 个,然后在这 4 个里选最好的,这就形成了:Random Forest。它比 Bagging 更随机,也更稳定。
Random Forest 不是让每个人看全部信息,而是让每个人只看一部分,再一起决策。
第三种方法:Boosting(提升法)
前面两种方法是大家各自独立,然后投票。而Boosting完全不同,它的思想是:后面的模型,专门学习前面的错误。
假设你在训练一个客服预测模型。
第一棵树: 错误了 20 个用户
第二棵树: 重点学习这 20 个
第三棵树: 继续学习还错的这就像:针对弱点进行刻意练习(Deliberate Practice),而不是一直重复已经会的内容。这正是 Boosting 的核心思想。
如果你问现实世界最常用的树模型是什么?答案几乎一定是XGBoost,它被广泛应用于:
金融风控
推荐系统
用户增长
运营分析
Kaggle 比赛并且表现非常稳定。
一个最简单的 XGBoost 示例如下:
from xgboost import XGBClassifier
model = XGBClassifier(
n_estimators=100,
max_depth=4,
learning_rate=0.1
)
model.fit(X_train, y_train)
prediction = model.predict(X_test)最重要的3个参数是:
n_estimators
表示树的数量max_depth
表示每棵树最多多复杂learning_rate
表示每次修正的幅度什么时候用树模型,而不是神经网络?
一个非常实用的判断标准:
如果你的数据像:Excel 表格,例如:用户年龄、是否购买、订单金额、登录次数等,那么树模型通常是首选。
如果你的数据像:图片 / 语音 / 文本,那么神经网络更合适。
在机器学习的发展过程中,人们逐渐意识到一件非常反直觉的事情:真正可靠的系统,往往不是建立在一个完美模型之上,而是建立在一群不完美模型之上。
单个模型可以很聪明,但它也可能很脆弱;它可能在一次训练中表现优异,也可能因为一条数据的变化而彻底改变判断。而当很多个模型被组织在一起,当它们在不同的数据上学习、在不同的路径上思考、再通过一种简单而朴素的方式达成一致时,系统就不再依赖某一次偶然的正确,而开始具备一种更接近现实世界的能力:抗噪声,抗波动,抗不确定性。
这其实也是现代工程系统的一个普遍规律。无论是分布式系统、金融风控,还是自动驾驶,都不会把决策交给一个单点,而是交给一个网络。
因为真正成熟的系统,从来不是追求“最聪明的一次判断”,而是构建一种结构,让错误可以被容忍,让偏差可以被抵消,让整体持续稳定地向正确靠近。
而树木组合,正是这种思想在机器学习中的一次具体实现。
附录:本文涉及的专有名词中英文对照(标红为最核心)