预测每个所选样本的类别分配概率Train_features:
probs = classifier.predict_proba(Train_features)`
Run Code Online (Sandbox Code Playgroud)
选择必须确定 AUC 的类别。
preds = probs[:,1]
Run Code Online (Sandbox Code Playgroud)
计算假阳性率、真阳性率以及可以清楚地区分 TP 和 TN 的可能阈值。
fpr, tpr, threshold = metrics.roc_curve(Train_labels, preds)
roc_auc = metrics.auc(fpr, tpr)
print(max(threshold))
Run Code Online (Sandbox Code Playgroud)
输出:1.97834
Bow*_*Bow 14
前面的答案并没有真正解决您为什么阈值 > 1 的问题,而且实际上当它说阈值没有任何解释时是误导性的。
从技术上讲,阈值的范围应该是[0,1],因为它是概率阈值。但 scikit learn 会在阈值数组的最后一个数字上添加 +1 以覆盖整个范围 [0, 1]。因此,如果在您的示例中 max(threshold) = 1.97834,则阈值数组中的下一个数字应为 0.97834。
请参阅此sklearn github 问题线程以获取解释。这有点有趣,因为有人认为这是一个错误,但这正是 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)]
Run Code Online (Sandbox Code Playgroud)