RandomForestClassifier OOB 评分方法

数据挖掘 随机森林 scikit-学习
2021-09-23 23:11:24

scikit-learn 中的随机森林实现是否使用平均准确度作为其评分方法来估计袋外样本的泛化误差?文档中没有提到这一点,但该score()方法报告了平均准确度。

我有一个高度不平衡的数据集,我在网格搜索中使用 ROC 的 AUC 作为我的评分指标。有没有办法告诉分类器对 OOB 样本也使用相同的评分方法?

1个回答

一般来说,分类器的性能是用准确率来比较的,准确率是正确分类的实例数除以实例总数的量度。然而,当我们使用集成学习或 bagging 技术时,我们可以从训练数据中更好地逼近分类器的预期误差。

袋外错误

该指标是示例的准确性xi使用随机森林集合中的所有树,这些树在训练期间被省略。因此,它有点像半测试实例。您可以了解您的分类器可以使用此指标进行泛化的程度。

要在 sklearn 中实现 oob,您需要在创建随机森林对象时将其指定为

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

然后我们可以训练模型

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

得分:0.979921928817

正如预期的那样,模型在评估训练集时的准确性非常高。然而,这是没有意义的,因为你很可能过度拟合你的数据,因此你的模型是垃圾。但是,我们可以使用袋外得分作为

print(forest.oob_score_)

0.86453272101

这是在仅使用省略的树评估训练集中的实例时的准确性。现在让我们计算测试集上的分数为

print('Score: ', forest.score(X_test, y_test))

得分:0.86517733935

我们看到通过 oob 测量的准确度与使用测试集获得的准确度非常相似。因此,通过理论,oob 准确度是评估模型性能的更好指标,而不仅仅是分数。这是套袋模型的结果,不能用其他类型的分类器来完成。

使用不同的指标计算 oob

是的,你可以做到这一点!但是,这取决于您的代码的结构究竟如何。我不确定如何将 oob 和 AUC 与cross_val_score函数一起包含在内。但是,如果您手动进行交叉验证折叠,您可以执行以下操作,sklearn 中的随机森林算法为您提供了 oob 的决策函数

print(forest.oob_decision_function_)

然后可以使用该类获得

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

然后我们可以使用以下公式计算 AUC

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204