如何在 scikit-learn 的 LogisticRegressionCV 调用中将参数传递给评分函数
How to pass argument to scoring function in scikit-learn's LogisticRegressionCV call
问题
我正在尝试使用 scikit-learn 的 LogisticRegressionCV
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())
问题
我正在尝试使用 scikit-learn 的 LogisticRegressionCV
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())