Scorer 函数:make_scorer/score_func 和
Scorer function: difference between make_scorer/score_func and
在 scikit 的 (0.18.1) 文档中,我发现下面的内容有点令人困惑。似乎可以通过多种方式编写自己的评分函数。但是有什么区别呢?
GridSearchCV 将 scoring
参数作为:
scorer callable object / function with signature scorer(estimator, X, y)
此选项在 model evaluation docs 中也受支持。
相反,make_scorer 想要 score_func
作为:
score function (or loss function) with signature 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
你看,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()
所做的只是 return 指向实际函数的指针,该函数执行我上面描述的所有操作。
从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"等字符串值时,也是先转换成scorer(estimator, X, y, ...)
通过使用 make_scorer,可以在 this line at the same source file
中验证
希望它有意义。如有任何疑问或问题,请随时提出。
在 scikit 的 (0.18.1) 文档中,我发现下面的内容有点令人困惑。似乎可以通过多种方式编写自己的评分函数。但是有什么区别呢?
GridSearchCV 将 scoring
参数作为:
scorer callable object / function with signature
scorer(estimator, X, y)
此选项在 model evaluation docs 中也受支持。
相反,make_scorer 想要 score_func
作为:
score function (or loss function) with signature
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
你看,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()
所做的只是 return 指向实际函数的指针,该函数执行我上面描述的所有操作。
从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"等字符串值时,也是先转换成scorer(estimator, X, y, ...)
通过使用 make_scorer,可以在 this line at the same source file
希望它有意义。如有任何疑问或问题,请随时提出。