roc_curve 指标中的阈值大于 1 可以吗?
Is it fine to have a threshold greater than 1 in roc_curve metrics?
从 Train_features
:
中预测每个选定样本的 class 分配概率
probs = classifier.predict_proba(Train_features)`
选择需要确定 AUC 的 class。
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
阈值没有任何解释,真正重要的是ROC曲线的形状。如果存在阈值(无论它们的值如何)使得生成的 ROC 曲线位于线性函数之上(优于随机猜测),则您的分类器表现良好;如果对于任何阈值,ROC 曲线仅在 (0,1) 处有一个点,则您的分类器具有完美的结果(这在实践中很少发生);如果对于任何阈值,ROC 曲线仅在 (1,0) 处有一个点,则您的分类器的结果最差。 ROC 曲线的积分是衡量分类器性能的一个很好的指标,该指标称为 AUC,限制在 0 和 1 之间,0 表示最差性能,1 表示完美性能。
之前的回答并没有真正解决您为什么阈值 > 1 的问题,实际上当它说阈值没有任何解释时会产生误导。
阈值范围在技术上应该是[0,1],因为它是概率阈值。但是 scikit learn 将阈值数组中的最后一个数字 +1 以覆盖整个范围 [0, 1]。因此,如果在您的示例中 max(threshold) = 1.97834,则阈值数组中的下一个数字应为 0.97834。
请参阅此 sklearn github issue thread 以获取解释。这有点好笑,因为有人认为这是一个错误,但这正是 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)]
从 Train_features
:
probs = classifier.predict_proba(Train_features)`
选择需要确定 AUC 的 class。
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
阈值没有任何解释,真正重要的是ROC曲线的形状。如果存在阈值(无论它们的值如何)使得生成的 ROC 曲线位于线性函数之上(优于随机猜测),则您的分类器表现良好;如果对于任何阈值,ROC 曲线仅在 (0,1) 处有一个点,则您的分类器具有完美的结果(这在实践中很少发生);如果对于任何阈值,ROC 曲线仅在 (1,0) 处有一个点,则您的分类器的结果最差。 ROC 曲线的积分是衡量分类器性能的一个很好的指标,该指标称为 AUC,限制在 0 和 1 之间,0 表示最差性能,1 表示完美性能。
之前的回答并没有真正解决您为什么阈值 > 1 的问题,实际上当它说阈值没有任何解释时会产生误导。
阈值范围在技术上应该是[0,1],因为它是概率阈值。但是 scikit learn 将阈值数组中的最后一个数字 +1 以覆盖整个范围 [0, 1]。因此,如果在您的示例中 max(threshold) = 1.97834,则阈值数组中的下一个数字应为 0.97834。
请参阅此 sklearn github issue thread 以获取解释。这有点好笑,因为有人认为这是一个错误,但这正是 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)]