使用 ROC 寻找较低的阈值

Finding lower threshold with ROC

我试图找到 X 的最佳阈值 T 来预测 Y。我通常会在此设置中使用 Youden 的 J,但是当阈值是下限时(在 Y 与 X 成反比的情况下),经典的实现似乎并不成立。

下面post有部分答案(第一个答案效果更好),但根据评论,方法不可靠,没有引用论文:

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 之间的正负关联?

您的问题是正值 class 的 X 值较低。 Sklearn 为正 class 假定更高的值,否则 ROC 曲线会反转,这里的 AUC 为 0.0:

from sklearn.metrics import roc_auc_score
print(roc_auc_score(Y, X))
# OUTPUT: 0.0

ROC分析来自于信号检测领域,关键取决于正信号的定义,即比较的方向。有些库可以自动为您检测到,有些则不能,但最后总是必须完成。

所以其余部分是正确的,"best" 阈值在这种情况下是曲线的一角。

只要确保您的积极 class 设置正确,您就可以开始了:

Y = X > 5