我在研究执行校准分类器的影响,我读到校准的目的是使分类器的预测更加“可靠”。考虑到这一点,我认为校准后的分类器应该会有更高的分数(roc_auc)
然而,当我在Python中使用sklearn测试这一假设时,我发现了完全相反的结果
你能解释一下吗:
校准是否能提高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])
回答:
简而言之:校准不应影响ROCAUC。
详细回答:
ROCAUC是一个排序的度量(“我们是否将这些观察结果按最佳顺序排列?”)。然而,它并不能保证好的概率。
例子:如果我在分类某人可能患癌症的可能性,我可能总是说一个95%到99%之间的数字,并且只要我按照正确的顺序做出预测(99%的人患有癌症,95%的人没有),我仍然可以有完美的ROCAUC。
在这里我们可以说这个分类器(在不太可能患癌时说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所测量的那样