用ROC查找下限阈值

时间:2019-05-23 15:36:50

标签: python statistics roc

我试图找到X的最佳阈值T来预测Y。我通常会在这种设置下使用Youden's J,但是当阈值是一个下限时(在Y与X成反比的情况下),实施似乎不成立。

以下文章有部分答案(第一个答案会产生更好的结果),但是根据评论,该方法不可靠,并且未引用任何论文: Roc curve and cut off point. Python

def cutoff_youdens_j(fpr, tpr, thresholds):
    j_scores = tpr-fpr # J = sensivity (=tpr) + specificity (=1-fpr) - 1
    j_ordered = sorted(zip(j_scores, thresholds))
    return j_ordered[-1][1]

import numpy as np
from sklearn.metrics import roc_curve

X = np.arange(1, 10)
# Y is an example of a binary dependent variable that varies inversely to the predictor X
Y = X < 5

fpr, tpr, thresholds = roc_curve(Y, X)
T = cutoff_youdens_j(fpr, tpr, thresholds)
print(T) 
# OUTPUT: 10

预期输出为5,但是我得到10
有没有更好的方法来选择最佳阈值,是否有论文证明了这一点? 如果它实际上是一个下限或上限,也将很有趣。

编辑: 可能是先反X然后反T。

X = np.arange(1, 10)
Y = X < 5
X = -X
fpr, tpr, thresholds = roc_curve(Y, X)
T = cutoff_youdens_j(fpr, tpr, thresholds)
T = -T
print(T) #OUTPUT 4 

这可行,但是必须预先确定关联的方向。还有其他方法可以同时处理X和Y之间的正向和负向关联吗?

1 个答案:

答案 0 :(得分:1)

您的问题是,阳性类别的X值较低。 Sklearn对阳性类别假定较高的值,否则ROC曲线会倒置,这里的AUC为0.0:

from sklearn.metrics import roc_auc_score
print(roc_auc_score(Y, X))
# OUTPUT: 0.0
ROC分析来自信号检测领域,它主要取决于正信号的定义,即比较的方向。有些库可以自动为您检测到,有些库则不能,但是最后必须总是这样做。

所以其余的都是正确的,在这种情况下,“最佳”阈值是曲线的拐角之一。

只要确保您的正面课程设置正确,就可以了:

Y = X > 5