我将一个自定义的评估度量函数传递给XGB fit(),但是Python API会丢弃可调用(即自定义)的函数。我们应该如何传递这个函数?还是PythonScikit 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
,这做你的配件,因为完成 此处. 而现在当你看到 docstring 的 train
你可以发现 feval
相当于 Customized evaluation function
. 由于 xgboost
使用该词 feval
用于引用自定义评估指标和 sklearn
使用该词 eval_metric
xgboost的作者为了方便理解,保留了变量的名称,并在内部做了这个转换。
希望对您有所帮助