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_true
、y_prediction
和y_score
。使用 roc_curve(y_true, y_prediction)
为您提供 3 个阈值。上面的两个(0 和 1)和第三个 2,我不得不承认我现在还不明白。以上是关于sklearn 如何计算二元分类器的 roc 曲线下面积?的主要内容,如果未能解决你的问题,请参考以下文章
第二章 | 分类问题 | F1-score | ROC曲线 | 精准率召回率 | tensorflow2.6+sklearn | 学习笔记
在 sklearn 中使用 Leave-One-Out 交叉验证的 ROC 曲线