Scikit Learn roc_auc_score 和 ROC Plot 的正确输入

Proper inputs for Scikit Learn roc_auc_score and ROC Plot

我正在尝试确定 roc_auc_score 适合验证集的模型。

我在函数输入中看到一些相互矛盾的信息。

Documentation 说:

"y_score 类似数组的形状 (n_samples,) 或 (n_samples, n_classes) 目标分数。在二进制和多标签的情况下,这些可以是概率估计或非阈值决策值(由 decision_function 在某些 classifier 上返回)。在 multiclass 的情况下,这些必须是总和为 1 的概率估计。二进制情况需要一个形状 (n_samples),并且分数必须是 class 的分数更大的标签。多 class 和多标签情况需要一个形状 (n_samples, n_classes)。在 multiclass 的情况下,class 分数的顺序必须对应于标签的顺序(如果提供),或者对应于 y_true 中标签的数字或字典顺序。”

不确定这到底需要什么:1) 针对测试集中实际 y 值的预测概率或 2) class 针对测试集中实际 y 值的预测

我一直在搜索,在二进制 class化情况下(我的兴趣),有些人使用预测概率,而其他人使用实际预测(0 或 1)。换句话说:

适合模特:

model.fit(X_train, y_train)

使用其中之一:

y_preds = model.predict(X_test)

或:

y_probas = model.predict_proba(X_test)

我发现:

roc_auc_score(y_test, y_preds)

和:

roc_auc_score(y_test, y_probas[:,1]) # probabilites for the 1 class

产生截然不同的结果。

哪一个是正确的?

我还发现要实际绘制 ROC 曲线,我需要使用概率。

感谢任何指导。

model.predict(...) 将为您提供每个观察的预测标签。也就是说,它将 return 一个充满 1 和 0 的数组。

model.predict_proba(...)[:, 1] 将为您提供每个观察值等于 1 的概率。也就是说,它将 return 一个包含 0 到 1 之间的数字的数组。

ROC 曲线的计算方法是采用每个可能的 概率 ,将其用作阈值并计算结果的真阳性率和假阳性率。因此,如果将 model.predict(...) 传递给 metrics.roc_auc_score(),则计算的是仅使用两个阈值(一或零)的 ROC 曲线的 AUC。 这是不正确的,因为这些不是您模型的预测概率。

要获得模型的 AUC,您需要将预测概率传递给 roc_auc_score(...):

from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])