Scikit Learn roc_auc_score 和 ROC 图的正确输入

Win*_*981 5 python roc scikit-learn auc

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

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

文档说:

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

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

我一直在搜索,在二元分类情况(我的兴趣)中,有些人使用预测概率,而另一些人使用实际预测(0 或 1)。换句话说:

适配型号:

model.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

使用以下任一方法:

y_preds = model.predict(X_test)
Run Code Online (Sandbox Code Playgroud)

或者:

y_probas = model.predict_proba(X_test)
Run Code Online (Sandbox Code Playgroud)

我发现:

roc_auc_score(y_test, y_preds)
Run Code Online (Sandbox Code Playgroud)

和:

roc_auc_score(y_test, y_probas[:,1]) # probabilites for the 1 class
Run Code Online (Sandbox Code Playgroud)

产生截然不同的结果。

哪一个是正确的?

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

任何指导表示赞赏。

Art*_*Sbr 9

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

model.predict_proba(...)[:, 1]将为您提供每个观察值等于 1 的概率。也就是说,它将返回一个充满 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])
Run Code Online (Sandbox Code Playgroud)