如何在sklearn中计算随机森林模型的AUC?

Posted

技术标签:

【中文标题】如何在sklearn中计算随机森林模型的AUC?【英文标题】:How to calculate AUC for random forest model in sklearn? 【发布时间】:2019-11-08 21:43:30 【问题描述】:

我的数据中的标签是一个 (N x 1) 向量。负样本的标签值为 0,正样本的标签值为 1(因此,这是一个二元分类问题)。我使用 sklearn 的 .fit 函数并在我的火车上安装了一个随机森林。要计算测试集的 AUC,我使用 metrics.roc_auc_score (test_labels, probabilities)。我正在使用 predict_proba(my_test_set) 获取概率。但是,predict_proba(my_test_set) 返回一个 (N_test, 2) 矩阵。我看到很多人使用这个返回矩阵的第二列 (predict_proba(my_test_set)[:,1]) 并将其提供给metrics.roc_auc_score 来计算 AUC,但为什么是第二列呢?为什么不是第一列 (predict_proba(my_test_set)[:,0])?

【问题讨论】:

【参考方案1】:

roc_auc_score() 期望 y_true 是班级的二元指标,y_score 是相应的分数。

在您的情况下,y_true 是正类的二进制指标。为便于理解,哪一列代表哪个类的概率得分,请使用clf.classes_。在我们的示例中,它将返回 array([0,1])。因此,我们需要使用第二列来获得第 1 类的概率分数。

即使遇到多类问题,也可以将标签 (y) 转换为所需类的二进制指示符,并使用 clf.classes_predict_proba() 的输出中选择相应的列。

查看this 示例了解更多详情。

【讨论】:

谢谢!是的,它确实返回 [0, 1]【参考方案2】:

ROC AUC 是通过将真实标签向量与 positive 类的概率预测向量进行比较来计算的。

所有scikit-learn分类器,包括RandomForestClassifier,都会将标签最高的类设置为正类,对应的预测概率总是在predict_proba矩阵的第二列。 roc_auc_score 做了同样的假设,并假设标签最高的类是正类。因此,两者对正类的定义相同,roc_auc_score 期望分类器事先将相应的概率放在第二列中。

这就是为什么你应该总是这样做:

roc_auc_score(y_test, RFC.predict_proba(X_test)[:,1])

【讨论】:

感谢您提供翔实的回答!那么,第一列(predict_proba(my_test_set)[:,0])是什么?负类的概率?这就是predict_proba(my_test_set)[i,0] + predict_proba(my_test_set)[i,1] = 1 的原因吗?谢谢! @khemedi 完全正确!

以上是关于如何在sklearn中计算随机森林模型的AUC?的主要内容,如果未能解决你的问题,请参考以下文章

使用超网格搜索和 10 倍 CV 调整参数后,随机森林模型的 AUC 较低

用随机森林计算 ROC AUC

如何在 Sklearn 的随机森林分类器中将训练模型用于另一个数据集?

在随机森林中使用 predict() 与 predict_proba() 计算时,ROC_AUC_SCORE 不同

随机森林如何评估特征重要性

随机森林原理与Sklearn参数详解