如何在scikit-learn的LogisticRegressionCV调用中传递参数给评分函数

11

问题

我正在尝试使用 scikit-learnLogisticRegressionCV,并将 roc_auc_score 作为评分指标。

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score

clf = LogisticRegressionCV(scoring=roc_auc_score)

但是当我试图拟合模型(clf.fit(X, y))时,它会抛出错误。

 ValueError: average has to be one of (None, 'micro', 'macro', 'weighted', 'samples')

很不错。清楚地了解正在发生的事情:roc_auc_score需要使用指定的average参数进行调用,根据其官方文档和上面的错误信息。所以我尝试了一下。

clf = LogisticRegressionCV(scoring=roc_auc_score(average='weighted'))

但事实证明,仅仅使用可选参数调用roc_auc_score是行不通的,因为这会引发另一个错误。

TypeError: roc_auc_score() takes at least 2 arguments (1 given)

问题

你有什么想法可以让我在使用LogisticRegressionCV时,将roc_auc_score作为评分指标,并指定一个参数来实现评分函数?

我在scikit-learn的GitHub repo中找不到相关讨论或SO问题,但肯定有人之前遇到过这个问题,对吧?


根据您提供的文档,average 的默认值为“宏”,因此不应该导致错误。 - BrenBarn
是的,不确定为什么它要求定义该参数。我以为可能是我使用的版本(0.16.1),但该版本的文档显示的也是同样的内容。 - Gyan Veda
3个回答

10

你可以使用make_scorer,例如:

from sklearn.linear_model import LogisticRegressionCV
from sklearn.metrics import roc_auc_score, make_scorer
from sklearn.datasets import make_classification

# some example data
X, y = make_classification()

# little hack to filter out Proba(y==1)
def roc_auc_score_proba(y_true, proba):
    return roc_auc_score(y_true, proba[:, 1])

# define your scorer
auc = make_scorer(roc_auc_score_proba, needs_proba=True)

# define your classifier
clf = LogisticRegressionCV(scoring=auc)

# train
clf.fit(X, y)

# have look at the scores
print clf.scores_

是的,发现了make_scorer,但问题出在average参数上,概率提取部分实际上并不是这个问题的一部分,但对于那些想要概率而不是二元预测的人来说,这是一个好的标志。 - Gyan Veda
我明白,是的。我猜我关注概率这件事,因为你正在使用AUC分数(如果不使用概率,这并没有太多意义)。 - Kris

8
我找到了解决这个问题的方法! scikit-learn在其metrics模块中提供了一个make_scorer函数,允许用户从其本地评分函数中创建一个评分对象,以指定为非默认值的参数(有关来自scikit-learn文档的此功能的更多信息,请参见此处)。
因此,我创建了一个评分对象并指定了average参数。
roc_auc_weighted = sk.metrics.make_scorer(sk.metrics.roc_auc_score, average='weighted')

然后,我将该对象传递给调用LogisticRegressionCV的函数中,它正常运行,没有任何问题!

clf = LogisticRegressionCV(scoring=roc_auc_weighted)

你走在正确的道路上,但是这里需要小心一点。我认为你可能在内部使用了.predict方法。你需要设置 make_scorer(..., needs_proba=True)。可以看看我的答案。 - Kris
Gyan是您的解决方案,roc_auc_weighted是否为您工作?我不喜欢创建一个hackish def roc_auc_score_proba(y_true, proba)的想法,因为在从Jupiter调用时会出现问题。 - Anatoly Alekseev
1
哦,我明白了。不知何故,在roc_auc_weighted中包含needs_proba=True会导致出现错误。但是你的示例“原样”运行良好。 - Anatoly Alekseev

2

有点晚了(4年后)。但是今天你可以使用:

clf = LogisticRegressionCV(scoring='roc_auc')

此外,所有其他的评分密钥都可以通过以下方式获得:
from sklearn.metrics import SCORERS
print(SCORERS.keys())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接