roc_curve指标中阈值大于1是否合适?

3
预测每个选定的Train_features样本分配到某一类别的概率:
probs = classifier.predict_proba(Train_features)`

选择需要确定AUC的类。

preds = probs[:,1]

计算假阳性率、真阳性率以及可以清晰分离TP和TN的可能阈值。

fpr, tpr, threshold = metrics.roc_curve(Train_labels, preds)
roc_auc = metrics.auc(fpr, tpr)
print(max(threshold))

输出:1.97834

2个回答

13

之前的回答并没有真正回答您为什么阈值>1的问题,事实上,当它说阈值没有任何解释时是误导性的。

阈值的范围应该在[0,1]之间,因为它是概率阈值。但是scikit-learn在阈值数组中将最后一个数字加上+1,以涵盖完整的范围[0,1]。因此,如果在您的示例中max(threshold)= 1.97834,则阈值数组中的下一个数字应为0.97834。

请参见sklearn github问题线程以获取说明。这有点有趣,因为有人认为这是一个错误,但这只是sklearn的创建者决定定义阈值的方式。

最后,由于它是概率阈值,因此它确实具有非常有用的解释。最佳截止点是使灵敏度+特异性最大的阈值。在sklearn中可以通过以下方式计算。

fpr_p, tpr_p, thresh = roc_curve(true_labels, pred)
# maximize sensitivity + specificity, i.e. tpr + (1-fpr) or just tpr-fpr
th_optimal = thresh[np.argmax(tpr_p - fpr_p)]

太棒了!这确实看起来像是一个 bug。最大阈值应该是 1,而不是 max + 1。 - Fernando Wittmann

0

阈值并没有任何解释,真正重要的是ROC曲线的形状。如果存在阈值(无论它们的值如何),使得生成的ROC曲线位于线性函数之上(好于随机猜测),则您的分类器表现良好;如果对于任何阈值,ROC曲线仅为一个点(0,1),则您的分类器具有完美的结果(这在实践中很少发生);如果对于任何阈值,ROC曲线仅为一个点(1,0),则您的分类器具有最差的结果。评估分类器性能的一个好指标是ROC曲线的积分,这个指标称为AUC,取值范围在0到1之间,最差性能为0,完美性能为1。


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