校准会提高 roc 分数吗?

Mor*_*eno 1 python classification machine-learning roc scikit-learn

我正在研究执行校准分类器的效果,我读到校准的目的是使分类器的预测更“可靠”。考虑到这一点,我认为校准后的分类器会有更高的分数 (roc_auc)

当用 sklearn 在 Python 中测试这个假设时,发现正好相反

你能解释一下吗:

校准会提高 roc 分数吗?(或任何指标)

如果不是真的。执行校准的优势是什么?

clf=SVC(probability=True).fit(X_train,y_train)
calibrated=CalibratedClassifierCV(clf,cv=5,method='sigmoid').fit(X_train,y_train)
probs=clf.predict_proba(X_test)[:,1]
cal_probs=calibrated.predict_proba(X_test)[:,1]

plt.figure(figsize=(12,7))
names=['non-calibrated SVM','calibrated SVM']
for i,p in enumerate([probs,cal_probs]):
    plt.subplot(1,2,i+1)
    fpr,tpr,threshold=roc_curve(y_test,p)
    plt.plot(fpr,tpr,label=nombre[i],marker='o')
    plt.title(names[i]+ '\n' + 'ROC: '+ str(round(roc_auc_score(y_test,p),4)))
    plt.plot([0,1],[0,1],color='red',linestyle='--')
    plt.grid()
    plt.tight_layout()
    plt.xlim([0,1])
    plt.ylim([0,1])
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

sap*_*ico 5

TLDR:校准不应影响 ROCAUC。

更长的答案:

ROCAUC 是排名的度量(“我们是否将这些观察结果按最佳顺序排列?”)。但是,它并不能确保良好的概率。

示例:如果我对某人患癌症的可能性进行分类,我可能总是说 95% 到 99% 之间的数字,并且仍然具有完美的 ROCAUC,只要我按正确的顺序进行预测(99 %s 得了癌症,而 95%s 没有)。

在这里,我们会说这个分类器(即 95% 时不太可能患有癌症)具有良好的排名能力,但校准不当。

所以,我们能做些什么?我们可以应用单调变换,在不改变排名能力的情况下修复它(因此不改变 ROCAUC)。

示例:在我们的癌症示例中,我们可以说预测低于 97.5%,它们应该减少 90%,当它们超过 97.5% 时,它们将被保留。这种非常粗鲁的方法不会影响 ROC,但会将“最低”预测发送到接近 0,从而改善我们的校准,如Brier Score所衡量的那样。

太好了,现在我们可以变得聪明了!提高 Brier Score 的“最佳”单调曲线是什么?好吧,我们可以让 Python使用scikit 的校准处理这个问题,它基本上为我们找到了那条曲线。同样,它会改进校准,但不会改变 ROCAUC,因为排名顺序保持不变。

太好了,所以 ROCAUC 不会移动。

然而......
在承认地球不围绕太阳运动后引用伽利略的话...... “E pur si muove” (但它仍在运动)

好的。现在事情变得时髦了。为了进行单调变换,一些接近的观测值(例如 25% 和 25.5%)可能会被“压扁”在一起(例如 0.7% 和 0.700000001%)。这可能会被四舍五入,导致预测变得并列。然后,当我们计算 ROCAUC 时......它会移动。

但是,出于所有实际目的,您可以预期“真正的” ROCAUC 不会受到校准的影响,它只会影响您测量概率的能力,如Brier Score所测量的那样