跳转至

14.3   随机森林

一棵决策树很会解释,但也容易被一批训练数据带偏。小率问:能不能让很多棵树一起投票?均哥点点头,把桌上的同学卡片随机抽成好几份,每份训练一棵树,再把结果汇总。

这就是 随机森林(Random Forest) 的直觉:用许多彼此有差异的树,降低单棵树的方差。

图 14.3.0 在小吃集市汇总多组投票

一棵树容易偏听偏信,很多棵树投票就稳一些?
正是这个思路。随机森林用“多样性”换稳定性。

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 样本随机 + 特征随机 + 多树投票。它用集成降低方差,常是表格任务的强基线;但模型更大、解释性更弱,特征重要性要谨慎解读。