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)
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所测量的那样
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |