你看,scikit-learn 有不同的实用函数(precision_score, recall_score, accuracy_score
等),可用于直接指定实际值和预测值并计算结果。在大多数情况下,即使编写自定义评分器也必须使用实际值和预测值。
所以签名必须是(y, y_pred, ...)
.
现在,在网格搜索或随机搜索等技术中,交叉验证数据的分数必须是自动的。随着估计量和 X 不断变化(X 由于交叉验证而变化),预测值和相应的实际值也会变化。
所以scorer(estimator, X, y)
说得通。采取估计器并X
, call estimator.predict(X)
要获得预测输出,请将其与实际(y
)并计算结果。
What make_scorer()
所做的只是返回一个指向实际函数的指针,该函数执行我上面描述的所有操作。
来自scikit-learn 中的源代码 https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/scorer.py,我们可以验证上面的事情:
Line347 : cls = _PredictScorer
return cls(score_func, sign, kwargs)
Here cls
是指向函数的指针这条线 https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/scorer.py#L75:
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)
另外,当您实际使用“准确度”、“精度”等字符串值时scoring
GridSearchCV中的参数,那么同样,它首先被转换为scorer(estimator, X, y, ...)
通过使用 make_scorer,可以在此行位于同一源文件中 https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/scorer.py#351
希望它有一定道理。如有任何疑问或疑问,请随时询问。