记分器功能:make_scorer / score_func和

时间:2017-04-20 15:02:04

标签: python python-2.7 scikit-learn grid-search

在scikit的(0.18.1)文档中,我发现有些令人困惑。似乎编写自己的评分函数可以通过多种方式实现。但是有什么区别?

GridSearchCVscoring参数作为:

  

得分者可签名的对象/功能,签名为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 个答案:

答案 0 :(得分:3)

你看,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参数中的等等,然后,首先使用make_scorer将其转换为scorer(estimator, X, y, ...),可以在this line at the same source file中验证

希望它有道理。如果有任何疑问或疑问,请随时询问。