我试图找到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之间的正向和负向关联吗?
答案 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