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

时间:2019-11-11 21:37:28

标签: roc auc

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 个答案:

答案 0 :(得分:1)

之前的答案并没有真正解决您为什么阈值 > 1 的问题,而且实际上在说阈值没有任何解释时具有误导性。

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

有关说明,请参阅此 sklearn github issue thread。这有点好笑,因为有人认为这是一个错误,但这正是 sklearn 的创建者决定定义阈值的方式。

最后,因为它是一个概率阈值,它确实有一个非常有用的解释。最佳临界值是灵敏度 + 特异性最大的阈值。在 sklearn learn 这可以像这样计算

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)]

答案 1 :(得分:0)

阈值没有任何形式的解释,真正重要的是ROC曲线的形状。如果存在阈值(无论其值如何),以使生成的ROC曲线位于线性函数上方(比随机猜测更好),则分类器的效果就很好。如果对于任何阈值,ROC曲线仅是(0,1)处的一个点,则您的分类器具有完美的结果(在实践中这种情况很少发生);如果对于任何阈值,ROC曲线仅是(1,0)的一点,则分类器的结果最差。 ROC曲线的积分是衡量分类器性能的一个很好的指标,该指标被称为AUC,并且限制在0到1之间,0表示最差的性能,1表示完美的性能。