scikit learn中roc_curve中的阈值

16

我参考以下链接和示例,从中获取了情节图表,但是我感到困惑。虽然只有4个阈值,但 roc 曲线似乎有很多数据点(>4个数据点)。因此,我想知道 roc_curve 是如何在底层工作以找到更多数据点的?

http://scikit-learn.org/stable/modules/model_evaluation.html#roc-metrics

>>> import numpy as np
>>> from sklearn.metrics import roc_curve
>>> y = np.array([1, 1, 2, 2])
>>> scores = np.array([0.1, 0.4, 0.35, 0.8])
>>> fpr, tpr, thresholds = 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 ])

在这里输入图片描述

2个回答

6
正如HaohanWang所提到的,在函数roc_curve中,参数drop_intermediate可以删除一些次优阈值,以创建更轻量级的ROC曲线。(roc_curve)。
如果将该参数设置为False,则会显示所有阈值,例如: enter image description here 计算了所有阈值及其对应的TPR和FPR,但其中一些是用于绘制ROC曲线无用的。

什么被认为是次优阈值? - CMCDragonkai
@CMCDragonkai 子优阈值对应于 ROC 曲线上与相邻点共线的点。例如,查看所有 TPR=1 的阈值。它们不会为 ROC 曲线增加任何内容,因此在它们之间进行插值更简单。有关详细信息,请参见源代码:https://github.com/scikit-learn/scikit-learn/blob/95119c13af77c76e150b753485c662b7c52a41a2/sklearn/metrics/_ranking.py#L916-L932 - Vivek

1

2
我明白了,谢谢maxymoo。我有一个一般性的问题,当我们在scikit learn中使用roc_curve时,我认为为了绘制ROC曲线,我们需要选择模型阈值,这反映了相关的FPR和FNR。想知道scikit learn roc_curve是如何选择阈值的? - Lin Ma
顺便提一下,maxymoo,在你的例子中,我认为为了绘制roc_curve,scikit learn还需要大量模型阈值的TPR和FNR性能,对吗?但在你的例子中,我不需要使用不同的阈值训练模型。如果您能再澄清一下,那就太好了。 :) - Lin Ma
1
我认为阈值只是score的不同取值。 - maxymoo
谢谢maxymoo,如果您能再详细解释一下就更好了。我对这行代码 fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) 有些困惑,其中 y_test[:, i] 是分类的真实结果,而 y_score[:, i] 是预测结果 => 在您提到的示例中 (http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html)。对于 score,我想您是指预测结果吧?也就是 y_score[:, i],我只是好奇从 y_score[:, i] 中如何得到离散值(我认为它是类标签预测结果,比如 01)。 - Lin Ma
继续画roc需要什么?我认为roc需要根据不同的模型阈值计算tpr和fpr,但在这个例子中,模型只得分/训练一次。如果我有任何误解,请随时纠正我。谢谢。 - Lin Ma
1
请参考 roc_curve 方法的 drop_intermediate 参数 (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html)。基本上,有时候 sklearn 决定删除一些无用的阈值,导致阈值小于不同的值。@LinMa - Haohan Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接