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

8
我的数据标签是一个(N行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])?
3个回答

10
ROC AUC是通过将真实标签向量与正类的概率预测向量进行比较来计算的。
所有的scikit-learn分类器,包括RandomForestClassifier,都会将具有最高标签的类设置为正类,并且相应的预测概率始终在predict_proba矩阵的第二列中。 roc_auc_score做出同样的假设,并且也假定具有最高标签的类为正类。因此,两者对正类的定义相同,roc_auc_score期望分类器事先将相应的概率放在第二列中。
这就是为什么你应该始终这样做的原因:
roc_auc_score(y_test, RFC.predict_proba(X_test)[:,1])

1
感谢您的详细回答!那么,第一列(predict_proba(my_test_set)[:,0])中是什么?负类的概率吗?这就是为什么 predict_proba(my_test_set)[i,0] + predict_proba(my_test_set)[i,1] = 1 吗?谢谢! - khemedi
@khemedi 没错! - MaximeKan

2

roc_auc_score()期望y_true是类的二进制指示器,而y_score是相应的分数。

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

即使您有多类问题,也要将标签(y)转换为所需类别的二进制指示器,并从predict_proba()的输出中使用clf.classes_选择相应的列。

请查看this示例以获取更多详细信息。


谢谢!是的,它确实返回 [0, 1]。 - khemedi

0
Scikit-learn有一个ROC曲线可视化API,可以应用于随机森林,并提供了AUC分数等其他功能。以下是与随机森林相关的部分代码:
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import RocCurveDisplay
from sklearn.model_selection import train_test_split

X, y = load_wine(return_X_y=True)
y = y == 2

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

rfc = RandomForestClassifier(n_estimators=10, random_state=42)
rfc.fit(X_train, y_train)
ax = plt.gca()
rfc_disp = RocCurveDisplay.from_estimator(rfc, X_test, y_test, ax=ax, alpha=0.8)
plt.show()

带着结果 在此输入图片描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接