sklearn 如何计算二元分类器的 roc 曲线下面积?

Posted

技术标签:

【中文标题】sklearn 如何计算二元分类器的 roc 曲线下面积?【英文标题】:How does sklearn calculates the area under the roc curve for a binary classifier? 【发布时间】:2018-05-24 08:56:08 【问题描述】:

这可能与here 提出的另一个问题重复出现。但是,我已经查看了那里的答案,但仍然无法理解 Scikit-learn 如何通过仅测试一个阈值来计算 roc 曲线下的面积,该阈值是在以下内容中提供的:

y_pred = clf.predict(X_test) roc_auc_score(y_test, y_pred)

为什么它不采用多个值(多个 y_test、y_pred 由多个阈值产生)?任何简化的解释将不胜感激。

【问题讨论】:

【参考方案1】:

在这种情况下,roc_auc_score() 的第二个参数应该是 clf.predict_proba(X_test)得到的预测概率。 在这个函数内部计算不同的阈值 这个预测概率的基础。 在documentation 中有一个例子:

import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_scores)
0.75

了解roc_auc_score 的计算方式可能会有所帮助 看看roc_curve它自己。这可以通过函数来​​完成 sklearn.metrics.roc_curve()。取自documentation的示例:

import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
fpr
array([ 0. ,  0.5,  0.5,  1. ])
tpr
array([ 0.5,  0.5,  1. ,  1. ])
thresholds
array([ 0.8 ,  0.4 ,  0.35,  0.1 ])

(尽管y在后一个例子中不同,它仍然是一个二进制 分类,其中 2 为正类。)

从后一个示例中可以看出,采用了不同的阈值 来自提供的scores

ROC Curve 将通过将真阳性率 tpr 放在图的 y 轴上并将误报率 fpr 放在图的 x 轴上来生成。

【讨论】:

如果我使用y_pred = clf.predict(X_test) 而不是clf.predict_proba(X_test) .. 根据这个:link 我认为它仍然可能 你是对的,可以使用clf.predict 输出,但这有一些影响,可能无法计算所需的数量。给定二进制分类clt.predict 返回一个包含零或一的数组。这些值也可以解释为分数(通常范围为 0 到 1)。 clf.predict_proba返回的分数差异 ...(不仅是 0 或 1)是您只有两个可能的阈值。 1) 分数高于或等于 1 的所有内容都被假定为正类。 2) 分数大于等于 0 的都被取走。 我在一个示例中检查了它,使用随机数为y_truey_predictiony_score。使用 roc_curve(y_true, y_prediction) 为您提供 3 个阈值。上面的两个(0 和 1)和第三个 2,我不得不承认我现在还不明白。

以上是关于sklearn 如何计算二元分类器的 roc 曲线下面积?的主要内容,如果未能解决你的问题,请参考以下文章

第二章 | 分类问题 | F1-score | ROC曲线 | 精准率召回率 | tensorflow2.6+sklearn | 学习笔记

在 sklearn 中使用 Leave-One-Out 交叉验证的 ROC 曲线

如何从具有 2 个输出神经元的 softmax 二元分类器绘制 ROC 曲线?

计算二元分类的 roc_curve 阈值

如何使用sklearn成对比较两条ROC曲线?

如何从分类树概率中绘制 ROC 曲线