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

问题描述 投票:0回答:3

我的数据中的标签是一个(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]
)?

scikit-learn random-forest auc
3个回答
10
投票

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])

2
投票

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

就像您的情况一样,

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

即使您遇到多类问题,也可以将标签 (

y
) 转换为所需类别的二进制指示器,并使用
predict_proba()
clf.classes_
的输出中选择相应的列。

查看this示例了解更多详细信息。


0
投票

Scikit-learn 有一个带有可视化 API 的 ROC 曲线,它也可以应用于随机森林,并提供 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()

结果

© www.soinside.com 2019 - 2024. All rights reserved.