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

Gya*_*eda 8 python arguments scoring function scikit-learn

问题

我试图用scikit学习LogisticRegressionCVroc_auc_score为得分度量.

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

clf = LogisticRegressionCV(scoring=roc_auc_score)
Run Code Online (Sandbox Code Playgroud)

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

 ValueError: average has to be one of (None, 'micro', 'macro', 'weighted', 'samples')
Run Code Online (Sandbox Code Playgroud)

这很酷.很明显发生了什么:roc_auc_score需要根据average指定的参数调用,根据其文档和上面的错误.所以我试过了.

clf = LogisticRegressionCV(scoring=roc_auc_score(average='weighted'))
Run Code Online (Sandbox Code Playgroud)

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

TypeError: roc_auc_score() takes at least 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

关于我如何以一种可以为评分函数指定参数的方式使用roc_auc_score评分指标的想法LogisticRegressionCV

我在scikit-learn的GitHub回购中找不到关于这个问题的SO问题或者对这个问题的讨论,但是肯定有人之前遇到过这个问题吗?

Gya*_*eda 7

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

scikit-learnmake_scorer在其metrics模块中提供了一个功能,该功能允许用户使用参数指定为非默认值的本机评分功能之一创建评分对象(有关scikit-learn文档中有关此功能的更多信息,请参见此处)。

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

roc_auc_weighted = sk.metrics.make_scorer(sk.metrics.roc_auc_score, average='weighted')
Run Code Online (Sandbox Code Playgroud)

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

clf = LogisticRegressionCV(scoring=roc_auc_weighted)
Run Code Online (Sandbox Code Playgroud)


Kri*_*ris 7

您可以使用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_
Run Code Online (Sandbox Code Playgroud)