13

如果我错了,请纠正我:scikit-learn 的 roc_curve 返回的“阈值”应该是 [0,1] 中的数字数组。但是,它有时会给我一个第一个数字接近“2”的数组。这是一个错误还是我做错了什么?谢谢。

In [1]: import numpy as np

In [2]: from sklearn.metrics import roc_curve

In [3]: np.random.seed(11)

In [4]: aa = np.random.choice([True, False],100)

In [5]: bb = np.random.uniform(0,1,100)

In [6]: fpr,tpr,thresholds = roc_curve(aa,bb)

In [7]: thresholds
Out[7]: 
array([ 1.97396826,  0.97396826,  0.9711752 ,  0.95996265,  0.95744405,
    0.94983331,  0.93290463,  0.93241372,  0.93214862,  0.93076592,
    0.92960511,  0.92245024,  0.91179548,  0.91112166,  0.87529458,
    0.84493853,  0.84068543,  0.83303741,  0.82565223,  0.81096657,
    0.80656679,  0.79387241,  0.77054807,  0.76763223,  0.7644911 ,
    0.75964947,  0.73995152,  0.73825262,  0.73466772,  0.73421299,
    0.73282534,  0.72391126,  0.71296292,  0.70930102,  0.70116428,
    0.69606617,  0.65869235,  0.65670881,  0.65261474,  0.6487222 ,
    0.64805644,  0.64221486,  0.62699782,  0.62522484,  0.62283401,
    0.61601839,  0.611632  ,  0.59548669,  0.57555854,  0.56828967,
    0.55652111,  0.55063947,  0.53885029,  0.53369398,  0.52157349,
    0.51900774,  0.50547317,  0.49749635,  0.493913  ,  0.46154029,
    0.45275916,  0.44777116,  0.43822067,  0.43795921,  0.43624093,
    0.42039077,  0.41866343,  0.41550367,  0.40032843,  0.36761763,
    0.36642721,  0.36567017,  0.36148354,  0.35843793,  0.34371331,
    0.33436415,  0.33408289,  0.33387442,  0.31887024,  0.31818719,
    0.31367915,  0.30216469,  0.30097917,  0.29995201,  0.28604467,
    0.26930354,  0.2383461 ,  0.22803687,  0.21800338,  0.19301808,
    0.16902881,  0.1688173 ,  0.14491946,  0.13648451,  0.12704826,
    0.09141459,  0.08569481,  0.07500199,  0.06288762,  0.02073298,
    0.01934336])
4

3 回答 3

7

大多数情况下,这些阈值不会被使用,例如在计算曲线下面积或绘制假阳性率与真阳性率之间的关系时。

然而,要绘制看似合理的曲线,需要有一个包含 0 个数据点的阈值。由于 Scikit-Learn 的 ROC 曲线函数不需要阈值的归一化概率(任何分数都可以),因此将此点的阈值设置为 1 是不够的;将其设置为inf是明智的,但编码人员通常期望数据有限(并且该实现可能也适用于整数阈值)。相反,实现使用max(score) + epsilonwhere epsilon = 1。这可能在外观上存在缺陷,但您没有给出任何理由说明这是一个问题!

于 2014-04-22T09:55:08.657 回答
6

从文档中:

thresholds : array, shape = [n_thresholds] 降低用于计算 fpr 和 tpr 的决策函数的阈值。thresholds[0]表示没有实例被预测并且任意设置为max(y_score) + 1.

所以第一个元素thresholds接近 2 因为max(y_score) + 1在你的情况下它是thresholds[1] + 1

于 2015-04-12T07:41:10.113 回答
1

这对我来说似乎是一个错误 - 在 roc_curve(aa,bb) 中,1 被添加到第一个阈值。你应该在这里创建一个问题https://github.com/scikit-learn/scikit-learn/issues

于 2014-04-21T16:12:15.410 回答