[英]XGBoost fit() custom eval_metric is not called. Why?
我将自定义评估指标 function 传递给 XGB fit(),但 Python API 丢弃了可调用(即自定义)函数。 为什么? 我们应该如何传递这个 function? 还是 Python/Scikit API 不支持此功能?
model = XGBClassifier(scale_pos_weight=scale_pos_weight)
model.fit(X_train, y_train, eval_metric=xgb_f1)
在 sklearn.py(第 755 行)中:
def fit(self, X, y, sample_weight=None, base_margin=None,
eval_set=None, eval_metric=None,
early_stopping_rounds=None, verbose=True, xgb_model=None,
sample_weight_eval_set=None, callbacks=None):
...
feval = eval_metric if callable(eval_metric) else None
if eval_metric is not None:
if callable(eval_metric):
eval_metric = None # <<<<<<<<<< If eval_metric is callable, it's discarded
else:
xgb_options.update({"eval_metric": eval_metric})
如果您更深入地查看源代码,您的自定义评估指标确实正在使用,如果您查看此行,请在上面发布的代码片段中:
feval = eval_metric if callable(eval_metric) else None
您的自定义评估指标(这是一个可调用的)被分配给这个名为feval
的变量,然后将其传递给实际方法train
,该方法会按照此处完成的方式进行拟合。 现在,当您查看train
方法的文档字符串时,您会发现feval
对应于Customized evaluation function
。 由于xgboost
使用术语feval
来指代自定义评估指标,而sklearn
使用术语eval_metric
,因此 xgboost 的作者保留了变量名称,以便于理解并在内部进行此转换。
啤酒花这有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.