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

How to pass argument to scoring function in scikit-learn's LogisticRegressionCV call

问题

我正在尝试使用 scikit-learnLogisticRegressionCV with 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')

太棒了。很清楚发生了什么:根据 its documentation 和上面的错误,需要使用指定的 average 参数调用 roc_auc_score。所以我试过了。

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

但事实证明 roc_auc_score 不能单独使用可选参数调用,因为这会引发另一个错误。

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

问题

关于如何使用 roc_auc_score 作为 LogisticRegressionCV 的评分指标,以便为评分函数指定参数,有什么想法吗?

我在 scikit-learn 的 GitHub 回购中找不到关于这个问题的 SO 问题或对这个问题的讨论,但肯定有人 运行进入这个之前?

我找到了解决这个问题的方法!

scikit-learn 在其 metrics 模块中提供了一个 make_scorer 函数,允许用户从其原生评分函数之一创建评分对象参数指定为非默认值(有关此函数的更多信息,请参阅 here scikit-learn 文档)。

因此,我使用指定的 average 参数创建了一个评分对象。

roc_auc_weighted = sk.metrics.make_scorer(sk.metrics.roc_auc_score, average='weighted')

然后,我在对 LogisticRegressionCV 的调用中传递了那个对象,它 运行 没有任何问题!

clf = LogisticRegressionCV(scoring=roc_auc_weighted)

您可以使用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_

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

clf = LogisticRegressionCV(scoring='roc_auc')

此外,所有其他得分键都可以通过以下方式获得:

from sklearn.metrics import SCORERS
print(SCORERS.keys())