记分器功能:make_scorer/score_func 和

Posted

技术标签:

【中文标题】记分器功能:make_scorer/score_func 和【英文标题】:Scorer function: difference between make_scorer/score_func and 【发布时间】:2017-09-17 07:19:39 【问题描述】:

在 scikit 的 (0.18.1) 文档中,我发现后面的内容有点混乱。似乎可以通过多种方式编写自己的评分函数。但是有什么区别呢?

GridSearchCV 将 scoring 参数作为:

带有签名scorer(estimator, X, y)的得分手可调用对象/函数

model evaluation docs 也支持此选项。

相反,make_scorer 想要一个 score_func 作为:

带有签名score_func(y, y_pred, **kwargs)的评分函数(或损失函数)

示例

GridSearchCV(scoring=dummy_scorer)GridSearchCV(scoring=make_scorer(dummy_scorer2)) 都打印预期的内容。

def dummy_scorer(estimator, X, y):
    print X
    print y
    return 1

def dummy_scorer2(y1, y2):
    print y1
    print y2
    return 1

【问题讨论】:

【参考方案1】:

你看,scikit-learn 有不同的实用函数(precision_score, recall_score, accuracy_score 等),可用于直接指定实际值和预测值并计算结果。在大多数情况下,即使编写自定义记分器也必须使用实际值和预测值。 所以签名必须是(y, y_pred, ...)

现在,在 GridSearch 或 RandomizedSearch 等技术中,交叉验证数据的得分必须是自动的。由于估计量和 X 不断变化(X 由于交叉验证而变化),因此预测值和相应的实际值也在变化。 所以scorer(estimator, X, y) 是有道理的。取估计器和X,调用estimator.predict(X)得到预测输出,与实际(y)比较并计算结果。

make_scorer() 所做的只是返回一个指向实际函数的指针,该函数完成了我上面描述的所有操作。

从source-code in scikit-learn,我们可以验证上面的东西:

Line347 : cls = _PredictScorer
          return cls(score_func, sign, kwargs)

这里cls是指向this line处函数的指针:

Line100 : y_pred = estimator.predict(X)
          if sample_weight is not None:
              return self._sign * self._score_func(y_true, y_pred, 
                                                 sample_weight=sample_weight,
                                                             **self._kwargs)
          else:
              return self._sign * self._score_func(y_true, y_pred, **self._kwargs)

另外,当你在GridSearchCV中实际使用scoring参数中的“accuracy”、“precision”等字符串值时,也会先使用make_scorer转换成scorer(estimator, X, y, ...),可以在@中验证987654323@

希望它有一些意义。如有任何疑问或问题,请随时询问。

【讨论】:

不要得到“交叉验证数据的分数必须是自动的”,你的意思是实用程序函数是自动调用的(在 GridSearch 循环内?) 在查看您的示例和整个图片后确定 (_PredictScorer)[github.com/scikit-learn/scikit-learn/blob/master/sklearn/… 我知道它是如何工作的。谢谢。 是的,完全正确。我的意思是在每个交叉验证循环中,通过调用记分器(在训练和测试数据上)自动计算分数 感谢您的支持 - scorer(estimator, X, y) 不在文档中!了解它正在做predict(X) 并在y 上得分是关键!

以上是关于记分器功能:make_scorer/score_func 和的主要内容,如果未能解决你的问题,请参考以下文章

使用 GridSearchCV 制作自定义记分器

用于 Scikit Learn 的 Keras Wrappers - AUC 记分器不工作

排球计分软件功能(记分员计分功能)

排球记分员计分程序————Controller控制器与Action方法的设计

python应用篇之外星人入侵项目——记分(上)

如何在 CSS 打印样式中标记分页符出现