You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取sklearn中RandomForestClassifier每棵单树的OOB得分

sklearn 随机森林单树OOB得分获取方案

sklearn 内置的RandomForestClassifier提供的oob_score_、oob_decision_function_均为全集成维度的聚合结果,不会存储单棵决策树的OOB指标,你可以通过模型实例存储的单树采样索引手动计算对应指标,实现逻辑如下:

  • 训练随机森林时必须开启oob_score=True参数,否则模型不会记录每棵树的bootstrap采样索引,无法提取对应OOB样本。
  • 单树的采样索引存储在模型的estimators_samples_属性中,该属性是长度等于集成树数量的列表,每个元素为布尔数组,值为True代表对应索引的样本被选中作为当前树的训练集,取反即可得到OOB留验样本的索引。
  • 遍历所有单树,提取对应OOB样本的特征、标签,调用单树的预测方法搭配自定义评估指标,即可得到单树在自身OOB样本上的得分/误差。

完整代码示例

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# 加载测试数据
X, y = load_iris(return_X_y=True)

# 训练随机森林,必须开启oob_score参数
rf = RandomForestClassifier(
    n_estimators=100,
    oob_score=True,
    random_state=42
)
rf.fit(X, y)

single_tree_oob_scores = []
n_samples = X.shape[0]

for tree_idx, tree in enumerate(rf.estimators_):
    # 获取当前树的训练样本掩码
    train_mask = rf.estimators_samples_[tree_idx]
    # 取反得到OOB样本掩码
    oob_mask = ~train_mask
    # 跳过无OOB样本的极端情况
    if not oob_mask.any():
        single_tree_oob_scores.append(None)
        continue
    # 计算当前树在OOB样本上的准确率,可按需替换为其他评估指标
    oob_score = tree.score(X[oob_mask], y[oob_mask])
    single_tree_oob_scores.append(oob_score)

上述代码输出的single_tree_oob_scores列表中,每个值就对应索引位置的单树在自身OOB留验样本上的得分,如果需要OOB误差,直接用1减去准确率,或替换为交叉熵等损失指标计算即可。

注意事项

  • 每棵树的OOB样本集都是独立随机采样得到的,不同树的OOB得分没有绝对的横向可比性,仅可用于单树自身的效果评估。

内容的提问来源于stack exchange,提问作者KDaneelOlivaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:06:03