RandomForestClassifier OOB评分方法


16

scikit-learn中的随机森林实现是否使用平均精度作为其评分方法来估计袋装样本的泛化误差?文档中未提及,但score()方法报告平均准确度。

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


RandomForestClassifier类的oob_score参数不能满足您的要求吗?
皮埃尔

AFAIK,oob_score报告准确性。不过,我需要再次查看源代码。
darXider

您在网格搜索中估计什么参数?
JahKnows

^对不起,但我现在真的不记得了!我1.5年前问过这个问题。
darXider

Answers:


14

通常,使用准确性比较分类器的性能,这是对正确分类的实例数除以实例总数的度量。但是,从训练数据中,当我们使用集成学习或装袋技术时,我们可以从分类器中更好地估计预期误差。

袋外错误

xi

要在sklearn中实现oob,您需要在创建Random Forests对象时将其指定为

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


4
谢谢!我知道OOB流程如何在随机森林中工作。我是专门询问是否RandomForestClassifier可以返回准确的OOB分数,答案的第二部分为如何解决此问题提供了很好的提示。但是,我必须强调,不应使用类别标签来计算ROC曲线的AUC。而是应该直接使用类概率。因此,正确的定义是pred_train = forest.oob_decision_function_[:, 1]
darXider

@darXider并不是很阴暗,因为forest.oob_decision_function_.shape [0] == X_train.shape [0],而我希望它是== OOB样本数,应该小于样本数在X_train中?另外,我个人对计算logloss感兴趣,对于其他也想这样做的人,我认为pred_train应该改为= forest.oob_decision_function_。
Sander Vanden Hautte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.