【问题标题】:How to pass argument to scoring function in scikit-learn's LogisticRegressionCV call如何在 scikit-learn 的 LogisticRegressionCV 调用中将参数传递给评分函数
【发布时间】:2016-12-26 22:45:06
【问题描述】:

问题

我正在尝试使用 scikit-learnLogisticRegressionCVroc_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 参数调用,根据its documentation 和上面的错误。所以我尝试了。

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 问题或对此问题的讨论,但肯定有人以前遇到过这个问题吗?

【问题讨论】:

  • 根据您链接到average 的文档,默认值为“macro”,因此不应导致错误。
  • 是的,不知道为什么它要求定义该论点。我认为这可能是我正在使用的版本 (0.16.1),但该版本的文档显示相同的内容。

标签: python function arguments scikit-learn scoring


【解决方案1】:

您可以使用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 参数上,概率提取部分实际上并不是这个问题的一部分,但对于那些想要概率而不是想要概率的人来说是个好标志二进制预测。
  • 我明白,是的。我想我专注于概率问题,因为您使用的是 AUC 分数(如果您不使用概率,这没有多大意义)。
【解决方案2】:

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

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)

【讨论】:

  • 你走在正确的道路上,但在这里必须小心一点。原因是我认为您可能在内部使用.predict 方法。您需要设置make_scorer(..., needs_proba=True)。看看我的回答。
  • Gyan 是您使用 roc_auc_weighted 的解决方案吗?我不喜欢创建一个 hackish def roc_auc_score_proba(y_true, proba) 的想法,从 Jupiter 调用它时会出现问题。
  • 哦。弄清楚了。以某种方式将 needs_proba=True 包含在 roc_auc_weighted 中会引发错误。但是您的示例“按原样”运行良好。
【解决方案3】:

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

clf = LogisticRegressionCV(scoring='roc_auc')

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

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

【讨论】:

    猜你喜欢
    • 2017-03-16
    • 2015-06-12
    • 2018-09-08
    • 2016-06-08
    • 2019-07-20
    • 1970-01-01
    • 2020-02-21
    • 2016-01-11
    相关资源
    最近更新 更多