在二进制分类设置中,根据ROC下的面积调整模型需要对模型输出进行阈值设置。
但是,在scikit-learn中,默认情况下,支持向量分类器不会生成类概率。
因此,例如,将GridSearchCV
与scoring=make_scorer(roc_auc_score, needs_threshold=False)
一起使用来调整SVC
模型是不正确的,因为AUC分数将根据每个类别中的预测类别计算得出简历折。无论我们使用SVC(probability=True)
还是SVC(probability=False)
,都会发生这种情况。另一方面,scoring=make_scorer(roc_auc_score, needs_threshold=True)
将正确调整。
因此,SVC
必须将一些“阈值”输出传递给GridSearchCV
中的评分功能。 我们如何知道给定模型的阈值输出是什么?
对于SVC
,我假设调用了decision_function()
方法。 (我假设它不是在计算类概率,因为使用predict_proba()
时无法在合适的GridSearchCV
对象上运行SVC(probability=False)
)。但是从文献来看,(至少对我而言)尚不清楚这确实是正在发生的事情。
答案 0 :(得分:1)
是的,您是正确的。
....
elif needs_threshold:
cls = _ThresholdScorer
....
因此,当needs_threshold = True
时,将使用_ThresholdScorer
得分手。现在查看source code of _ThresholdScorer
,我们会看到:
....
....
try:
y_pred = clf.decision_function(X)
# For multi-output multi-class estimator
if isinstance(y_pred, list):
y_pred = np.vstack(p for p in y_pred).T
except (NotImplementedError, AttributeError):
y_pred = clf.predict_proba(X)
因此,这将首先调用估计器的decision_function()
来找到阈值。