如何获取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
相关产品推荐
相关产品推荐

