14.3 随机森林¶
一棵决策树很会解释,但也容易被一批训练数据带偏。小率问:能不能让很多棵树一起投票?均哥点点头,把桌上的同学卡片随机抽成好几份,每份训练一棵树,再把结果汇总。
这就是 随机森林(Random Forest) 的直觉:用许多彼此有差异的树,降低单棵树的方差。
一棵树容易偏听偏信,很多棵树投票就稳一些?
正是这个思路。随机森林用“多样性”换稳定性。
14.3.1 Bagging 让树看到不同样本¶
随机森林的第一层随机来自 自助采样(Bootstrap Sampling):从训练集中有放回抽样,得到许多不同的数据子集。每个子集训练一棵树。
如果训练集有 \(n\) 个样本,每棵树也抽 \(n\) 次,但因为有放回,大约只有 63.2% 的独特样本会进入某棵树。没被抽到的样本可以用来估计袋外误差(Out-of-Bag Error)。
Bagging 的一句话
Bagging 是 Bootstrap Aggregating:先随机抽很多训练集,再训练很多模型,最后平均或投票。
14.3.2 特征随机让树彼此不同¶
如果每棵树都总是优先使用同一个强特征,它们会长得很像,投票也没那么有用。随机森林在每次分裂时,只从一部分特征里挑最优切分。
这带来两个好处:
- 降低树之间的相关性。
- 让弱一些但有用的特征也有机会参与。
分类时,森林多数投票:
\[
\hat y=\operatorname{mode}\{T_1(\mathbf{x}),T_2(\mathbf{x}),\ldots,T_B(\mathbf{x})\}
\]
回归时,森林取平均:
\[
\hat y=\frac{1}{B}\sum_{b=1}^{B}T_b(\mathbf{x})
\]
14.3.3 随机森林适合做强基线¶
| 优点 | 说明 |
|---|---|
| 稳定 | 比单棵树方差低 |
| 少调参 | 默认参数常能给出不错基线 |
| 不怕尺度 | 通常不需要标准化 |
| 能处理非线性 | 自动捕捉特征交互 |
它的代价是:模型更大、预测更慢,解释性不如单棵树清楚。特征重要性也可能偏向取值多的特征,必要时用排列重要性(Permutation Importance)复核。
随机森林是不是表格数据里很稳的第一版模型?
是。它常常不是最终冠军,但很适合作为强基线。
14.3.4 用 Python 训练随机森林¶
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
X, y = make_classification(
n_samples=600,
n_features=10,
n_informative=6,
random_state=2026,
)
forest = RandomForestClassifier(
n_estimators=300,
max_features="sqrt",
min_samples_leaf=3,
oob_score=True,
random_state=2026,
)
forest.fit(X, y)
scores = cross_val_score(forest, X, y, cv=5, scoring="f1")
print("OOB 分数 =", round(forest.oob_score_, 3))
print(f"5 折 F1 = {scores.mean():.3f}")
小率的笔记本
随机森林 = Bootstrap 样本随机 + 特征随机 + 多树投票。它用集成降低方差,常是表格任务的强基线;但模型更大、解释性更弱,特征重要性要谨慎解读。
