0Pricing
Learn AI with Python · 课时

随机森林与装袋法

集成学习概念、RandomForestClassifier、n_estimators、特征重要性和 OOB 分数

随机森林与装袋法 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

单棵树的问题

单棵决策树具有高方差:在略有不同的数据上重新训练,可能产生完全不同的树。集成方法通过组合多棵树解决这一问题。

装袋法(自助聚合)

装袋法在数据的不同自助样本(有放回的随机抽样)上训练许多模型,然后对它们的预测结果求平均。

对许多高方差模型求平均,可以降低整体方差,同时不会明显增加偏差。

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag = BaggingClassifier(
    estimator=DecisionTreeClassifier(),
    n_estimators=100,
    random_state=0,
)
bag.fit(Xtr, ytr)

从装袋法到随机森林

随机森林是树的装袋法,外加一个技巧:在每次分裂时,它只考虑特征的随机子集。

这会降低树之间的相关性,使它们的错误更好地相互抵消,从而改善集成效果。

RandomForestClassifier 基础

请使用 RandomForestClassifier。关键参数 n_estimators 决定要构建多少棵树。树越多越稳定,但速度越慢。

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=200, random_state=0)
rf.fit(Xtr, ytr)
print("Accuracy:", rf.score(Xte, yte))

使用 n_jobs 并行训练

森林中的树相互独立,因此可以并行训练。请将 n_jobs=-1 设置为使用所有 CPU 核心,从而显著加快拟合速度。

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=500,
    n_jobs=-1,        # use all cores
    random_state=0,
)
rf.fit(Xtr, ytr)

袋外(OOB)分数

每棵树都会遗漏约三分之一的样本(自助采样没有选中它们)。这些袋外样本构成了内置验证集。

请设置 oob_score=True,无需单独拆分数据即可免费估计泛化误差。

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=300,
    oob_score=True,
    random_state=0,
)
rf.fit(Xtr, ytr)
print("OOB score:", rf.oob_score_)

控制森林中的树深度

同样的树参数也适用:max_depth、min_samples_leaf 和 max_features(每次分裂时尝试的特征数量)。

max_features="sqrt" 是分类任务中常用的默认值。

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=300,
    max_depth=12,
    max_features="sqrt",
    random_state=0,
)

内置特征重要性

与单棵树一样,森林也提供 feature_importances_,其结果是所有树的平均值。这种基于不纯度的重要性计算速度快,但可能偏向取值基数较高的特征。

from sklearn.ensemble import RandomForestClassifier
import numpy as np

rf = RandomForestClassifier(n_estimators=200, random_state=0).fit(Xtr, ytr)
order = np.argsort(rf.feature_importances_)[::-1]
for i in order[:5]:
    print(i, rf.feature_importances_[i])

置换重要性

置换重要性更可靠:它会打乱某个特征列,并衡量 score 下降的幅度。下降幅度大意味着该特征很重要。

它与模型无关,并能避免不纯度偏差。

from sklearn.inspection import permutation_importance

result = permutation_importance(
    rf, Xte, yte, n_repeats=10, random_state=0, n_jobs=-1
)
print(result.importances_mean)

解读置换结果

permutation_importance 会返回多次重复运行中的 importances_mean 和 importances_std。请在留出集上计算它,从而衡量其对泛化能力的影响,而不是训练拟合效果。

import numpy as np

means = result.importances_mean
stds = result.importances_std
for i in np.argsort(means)[::-1]:
    print(f"feature {i}: {means[i]:.3f} +/- {stds[i]:.3f}")

何时使用随机森林

随机森林是很好的默认选择:稳健、几乎不需要调参,能够处理非线性和交互作用,并且不易过拟合。缺点是比单棵树占用更多内存、预测速度更慢,而且可解释性较低。

快速检查

请检查您对装袋法和随机森林的理解。

回顾

回顾:装袋法在自助样本上训练模型并对结果求平均,以降低方差。随机森林在每次分裂时额外使用随机特征子集。使用 n_estimators 调参,使用 n_jobs=-1 提高速度,通过 oob_score 获得免费验证;为获得可靠的排名,应优先使用 permutation_importance,而不是基于不纯度的重要性。

常见问题解答

「随机森林与装袋法」课时是免费的吗?

是的 — 「随机森林与装袋法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「随机森林与装袋法」这节课中我会学到什么?

集成学习概念、RandomForestClassifier、n_estimators、特征重要性和 OOB 分数 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「随机森林与装袋法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 决策树:原理与实现
  2. 随机森林与装袋法
  3. 梯度提升:GBM 与 XGBoost
  4. LightGBM 与 CatBoost
← 返回 Learn AI with Python