我正在研究执行经过校准的分类器的效果,并且我读到,校准的目的是使分类器的预测更加“可靠”。 考虑到这一点,我认为校准的分类器将具有更高的分数(roc_auc)
当用sklearn y在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])
答案 0 :(得分:0)
TLDR:校准不应影响ROCAUC。
更长的答案:
ROCAUC是等级的量度(“我们是否将这些观察结果按最佳顺序排列?” )。但是,它不能确保良好的机率。
示例:如果我要对某人患癌症的可能性进行分类, 可能总是说一个介于95%和99%之间的数字,并且仍然完美 ROCAUC,只要我以正确的顺序做出了预测( 99%的人患有癌症,而95%的人没有。
在这里我们要说这个分类器(那时95% 不太可能患有癌症)具有良好的排名能力,但很差 已校准。
那我们该怎么办?我们可以应用monotonic转换,在不更改排名能力(因此不更改ROCAUC)的情况下对其进行修复。
示例:在我们的癌症示例中,我们可以说预测是 低于97.5%,则应减少90%;超过 他们将保留97.5%。这种真正的粗暴方法不会影响ROC,但会发送“最低”的预测值,使其接近于0, 通过Brier Score来衡量我们的校准水平。
太好了,现在我们可以变得聪明了!改善Brier分数的“最佳”单调曲线是什么?好吧,我们可以使用let Python deal with this scikit's calibration,从本质上为我们找到那条曲线。同样,它将保持等级顺序,从而改善校准,但不会更改ROCAUC。
太好了,因此ROCAUC不会移动。
还有...
在承认地球不会绕太阳运动之后引用伽利略。... “ E pur si muove” (但它仍在运动)
好的。现在事情变得时髦了。为了进行单调变换,一些接近的观测值(例如25%和25.5%)可能会被“压缩”在一起(例如0.7%和0.700000001%)。这可能会被四舍五入,导致预测变得束缚。然后,当我们计算ROCAUC时...它将会移动。
但是,出于所有实际目的,您可以期望“真实的” ROCAUC不会受到校准的影响,并且应该仅仅影响您用Brier Score测量的概率测量概率