知识点深化 · 随机森林
随机森林:Bagging 与特征随机
单棵决策树容易过拟合,那训练 100 棵树投票呢?随机森林靠两处「随机」——样本有放回抽样(Bagging)、每节点只看 √m 个特征——让每棵树长得不一样,最后投票融合。这一页讲清楚 Bagging、特征随机和 OOB 袋外评估。
① 小白第一课怎么学(4 步走,约 60 分钟)
随机森林 = 很多棵决策树投票。按这四步走:
1看图建立直觉(10 分钟)
读第②③部分:看 Bagging 怎么抽样、每棵树怎么独立训练、最后怎么投票。
2记核心机制(15 分钟)
读第④部分:样本随机、特征随机、OOB 评估、投票/平均。
3手算例题(20 分钟)
精读第⑤部分,跟着算一遍投票和 OOB。
4刷题+纠错(15 分钟)
做第⑦⑩部分,错题回到第⑥部分高频错误里找原因。
本课小目标学完你要能:① 说出随机森林为什么比单棵决策树准;② 解释"样本随机"和"特征随机"两处随机分别在哪;③ 说清楚 OOB 是什么、怎么用。
② 一图看懂:随机森林全地图
读法:中心是"随机森林",四大块——样本随机(Bagging)、特征随机、多树投票、OOB 评估;下方是应用和易错。
③ 本质直觉:三个臭皮匠顶个诸葛亮
单棵决策树容易过拟合、对异常点敏感。那我训练 100 棵树,让它们各自看不同的数据、用不同的特征,最后投票表决,是不是就稳了?
第一步:样本随机(Bagging)。从 N 个样本里有放回地抽 N 个(叫 bootstrap),组成每棵树的训练集。注意是"有放回"——同一个样本可能被抽多次,也可能一次都没抽到。
第二步:特征随机。每次分裂节点时,不从全部 m 个特征里选,而是先随机抽 √m(分类)或 m/3(回归)个特征,再在这小堆里挑最优。这让每棵树长得不一样。
第三步:投票。来了新样本,100 棵树各自给答案,分类时少数服从多数,回归时取平均。
为什么有效?单棵树误差大但有规律;很多棵"不一样"的树平均后,方差大大降低。关键是树之间要不同——如果 100 棵树一模一样,投票等于没投。样本随机和特征随机就是为了让树不一样。
OOB(袋外数据)是什么每棵树 bootstrap 抽样时,约有 37% 的样本没被抽到(叫 out-of-bag)。这些样本正好可以当免费的验证集——用没参与训练的数据评估这棵树。OOB score 就是这么来的,省了单独划验证集。
④ 完整体系与公式表
Bagging 抽样
Bootstrap 有放回抽样
从 N 个样本中有放回抽 N 个 → 每棵树训练集
单个样本没被抽中的概率 = (1 − 1/N)N ≈ e−1 ≈ 36.8%
特征随机子空间
| 任务 | 每次分裂随机选多少特征 | 说明 |
| 分类 | max_features = √m | m 为总特征数 |
| 回归 | max_features = m/3 | 常用默认 |
预测融合
分类:多数投票;回归:平均
分类:Ĵ = vote( h₁(x), h₂(x), …, hT(x) )
回归:ŷ = (1/T) · Σt=1..T ht(x)
关键超参数
| 参数 | 含义 | 常用值 |
| n_estimators | 树的数量 | 100~500 |
| max_depth | 每棵树深度 | None(长到纯)或 10 |
| max_features | 每次分裂选多少特征 | 'sqrt'(分类默认) |
| oob_score | 是否用 OOB 评估 | True |
| n_jobs | 并行核数 | -1 用全部核 |
Python 代码片段
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, max_features='sqrt', oob_score=True, n_jobs=-1)
model.fit(X_train, y_train)
print(model.oob_score_) → OOB 准确率
⑤ 用法场景与典型例题
例1(基础·投票)5 棵树对某样本的预测分别是:正、正、负、正、正,最终分类?
少数服从多数。
① 正类票 = 4,负类票 = 1。
② 多数是正类。
答案:最终预测正类。
例2(OOB 概率)N=1000,单个样本没被某棵树抽中的概率大约多少?
用 (1−1/N)ᴺ 近似 e⁻¹。
① (1−1/1000)¹⁰⁰⁰ ≈ e⁻¹ ≈ 0.368。
② 即每棵树约 370 个样本是 OOB。
答案:约 36.8%,这就是 OOB 数据来源。
例3(回归平均)5 棵树对房价预测分别是 80、85、78、90、82 万,最终预测?
回归取平均。
① 平均 = (80+85+78+90+82)/5 = 415/5 = 83 万。
答案:随机森林回归预测 83 万。平均后比单棵树稳定,方差小。
随机森林为什么不用剪枝Bagging 已经通过多树平均把方差压下来了,单棵树即使长到过拟合,平均后过拟合也会被抵消。所以随机森林里每棵树通常不长深度限制(max_depth=None),让它尽情长。但 n_estimators 不是越大越好——几百棵后收益递减,内存却一直涨。
⑥ 高频错误诊断(4 条)
错误 1:以为树越多越好,调到 5000 棵n_estimators 从 100 加到 300 收益明显,再加到 2000 几乎没提升,但训练时间和内存翻倍。对策:100~500 足够,看验证曲线。
错误 2:把 max_features 设成全部特征这样每棵树每次分裂都用同样的最优特征,树之间高度相关,Bagging 失效。分类务必用 'sqrt',这是随机森林"随机"的核心。
错误 3:把随机森林当特征选择黑箱不解释随机森林能输出 feature_importances_,告诉你哪个特征最重要。但它不显示因果,相关性≠因果,别乱解读。
错误 4:类别不平衡不处理和决策树一样,多数类会主导投票。要用 class_weight='balanced' 或调整投票权重。
⑦ 考点真题演练(4 题)
考点分布
| 考法 | 出题形式 | 应对 |
| Bagging 原理 | 问样本怎么抽 | 有放回 bootstrap |
| 特征随机 | 问每次分裂选多少特征 | 分类 √m,回归 m/3 |
| OOB | 问 OOB 是什么 | 没被抽中的 37% 样本当验证集 |
| 优势 | 为什么比单棵树好 | 多树降方差、抗过拟合 |
真题基础1. 随机森林中 Bagging 的抽样方式是?
真题中档2. 分类任务中,随机森林每次分裂节点默认随机选多少个特征?
真题中档3. OOB(袋外数据)指的是?
真题拔高4. 随机森林相比单棵决策树,主要降低了什么?
⑧ 必背公式卡
抽样:有放回 bootstrap,每棵树 N 个样本 Bagging
OOB 率:(1−1/N)ᴺ ≈ e⁻¹ ≈ 36.8% 没抽到的当验证集
特征随机:分类 √m,回归 m/3 让树长得不一样
融合:分类投票,回归平均 少数服从多数
n_estimators:100~500 够了 不是越大越好
效果:降方差、抗过拟合、抗异常点 比单棵树稳
铁律:max_features 必须随机,否则退化成 Bagging 单特征树 两处随机缺一不可
⑨ 应用输出:用随机森林做用户流失预测
建模场景:电商平台预测用户是否会流失
平台有 10 万用户数据:浏览时长、下单频次、客单价、客服投诉次数、会员等级等 20 个特征,标签 y=1 表示下月流失。
① 选模型:表格数据、特征类型杂(数值+类别),随机森林是首选,不用精细调参就很强。
② 训练:RandomForestClassifier(n_estimators=200, oob_score=True, n_jobs=-1).fit(X, y)。
③ 看 OOB:oob_score_=0.87,说明模型泛化不错,不用再单独划验证集。
④ 特征重要性:发现"客服投诉次数"和"最近 30 天登录天数"最重要——产品就知道该重点盯这两个指标。
⑤ 预警:对预测流失概率 >0.6 的用户发优惠券召回。
⑥ 评估:AUC=0.89,比单棵决策树的 0.78 提升明显,且更稳定。
口述训练思路合上课本说一遍:"抽样有放回、分裂特征随机选 √m、训 100~500 棵树、投票融合;OOB 免费验证;好处是稳、抗过拟合、不用怎么调参;缺点是训练慢、模型大、不如树可解释。"
⑩ 分层练习 18 题(基础 6 + 中档 6 + 拔高 6)
▍基础 6 题
基础2Bagging 是有放回还是无放回抽样?
有放回(bootstrap)。
基础5OOB 数据是什么?
bootstrap 中没被抽中的样本,约 37%,可当免费验证集。
基础6随机森林的"随机"体现在哪两处?
样本随机(bootstrap)和特征随机(每节点选 √m)。
▍中档 6 题
中档7N=100,某样本没被某棵树抽中的概率大约?
(1−1/100)¹⁰⁰≈e⁻¹≈36.8%。
中档8100 棵树,60 棵说正、40 棵说负,预测?
多数正类,预测正。
中档9特征数 m=25,分类任务每次分裂选几个特征?
√25=5 个。
中档10随机森林需要像单棵决策树那样剪枝吗?
一般不用。多树平均已经压掉方差,单棵树可以尽情长。
中档11n_jobs=-1 是什么意思?
用 CPU 全部核心并行训练树。
中档12feature_importances_ 是什么?
特征重要性排序,按特征带来的纯度提升汇总。
▍拔高 6 题
拔高13为什么树之间要"不一样"?
如果树完全一样,投票等于单棵树,无法降方差。样本和特征随机就是为了制造差异。
拔高14把 max_features 设成全部 m,会怎样?
每棵树每次都选同样的最优特征,树高度相关,随机森林退化成普通 Bagging,效果下降。
拔高15OOB score 怎么算出来的?
对每个样本,用没抽到它的那些树来预测,汇总这些预测算准确率,即 OOB score。
拔高16随机森林主要降低偏差还是方差?
方差。单棵树高方差低偏差,多树平均后方差大降,偏差基本不变。
拔高17随机森林处理类别不平衡怎么办?
加 class_weight='balanced',或对少数类过采样。否则多数类主导投票。
拔高18随机森林和 GBDT(梯度提升树)的区别?
RF 是 Bagging:树并行独立、投票平均,降方差;GBDT 是 Boosting:树串行、每棵纠正前一棵的残差,降偏差。
⑪ 记忆口诀 + 7 天复习计划
三句口诀
① 随机森林很多树,样本特征双随机。
② 有放回抽 N 个,三成七没抽当验证(OOB)。
③ 分类投票回归平均,多树平均降方差。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③④,画一遍 Bagging 流程 | 说出两处随机在哪 |
| 第 2 天 | 背公式卡 + 做基础 1-6 | 基础全对 |
| 第 3 天 | 做中档 7-12,手算 OOB 概率 | 37% 记住 |
| 第 4 天 | 做拔高 13-18,对比 RF vs GBDT | 说出 Bagging vs Boosting |
| 第 5 天 | 做⑦真题 4 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合上书口述三句口诀,写 OOB 概率公式 | 不看资料全默对 |
← 返回算法与AI总览