2017-04-20 232 views
0
之间的区别

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

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学习具有不同的效用函数,其可用于直接指定实际和预测值计算结果(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

希望它有道理。请随时询问是否有任何疑问或问题。

+1

没有得到“交叉验证数据的分数必须自动”,你的意思是自动调用效用函数(在GridSearch循环内?) –

+0

确定后查看您的示例和整个图片(_PredictScorer)[HTTPS:// github上。com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/scorer.py#L74]我看它是如何工作的。谢谢。 –

+0

是的,确切地说。我的意思是在每个交叉验证循环中,通过调用记分器(在训练和测试数据上)自动计算得分, –