随机森林与装袋法
集成学习概念、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 反馈 — 无需本地设置。