使用预测概率或与分离超平面的距离来计算 ROC 曲线是否更好?

机器算法验证 scikit-学习
2022-03-22 03:48:45

我的问题部分是由scikit-learn. 文档中,有两个 示例说明如何计算接收器操作特性 (ROC) 曲线。

一个predict_proba用来

计算样本可能结果的概率 [...]。

,而其他用途decision_function,产生

样本 X 到分离超平面的距离。

什么时候应该使用每一个?

1个回答

我从务实的角度回答这个问题,只是通过查看代码并从示例中推断出来。一个更理论的答案可能是一个很好的补充。

一般两者都可以使用。区别在这里得到了很好的解释。

然而最相关的是,并非所有算法都提供predict_probadecision_function据我所知,每个分类器都允许predict_proba在 sklearn 中使用。对于某些人——特别是 SVC(支持向量分类)——两者都给出完全相同的结果。为了检查,我使用了这个predict_proba示例并使用和 once更改了代码一次decision_function

具体来说,我改变了:

probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])
# Compute ROC curve and area the curve
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])

至:

probas_ = classifier.fit(X[train], y[train]).decision_function(X[test])
# Compute ROC curve and area the curve
fpr, tpr, thresholds = roc_curve(y[test], probas_)   

两者都产生与您在图像中看到的完全相同的结果:

在此处输入图像描述

在此处输入图像描述

然而,这仅适用于 SVC,其中到决策平面的距离用于计算概率 - 因此 ROC 没有差异。

在另一个示例中,特定的代码行与此问题相关:

if hasattr(clf, "decision_function"):
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
else:
    Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

因此,从 sklearn 示例中推断,我建议您decision_function尽可能使用 ,如果没有,请使用 提供的概率predict_proba

decision_function在 sklearn 中不提供 a 的算法示例:

  • KNeighborsClassifier()
  • RandomForestClassifier()
  • GaussianNB()