XGBoost fit() 自定义eval_metric没有被调用。为什么?

问题描述 投票:1回答:1

我将一个自定义的评估度量函数传递给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})
python scikit-learn xgboost
1个回答
0
投票

如果你深入研究一下源代码,你的自定义评估指标确实被使用了,在你上面发布的代码片段中,如果你看这一行。

feval = eval_metric if callable(eval_metric) else None

你的自定义评估指标(是一个可调用的) 被分配给这个变量,叫做 feval 然后被传递给实际的方法。train,这做你的配件,因为完成 此处. 而现在当你看到 docstringtrain 你可以发现 feval 相当于 Customized evaluation function. 由于 xgboost 使用该词 feval 用于引用自定义评估指标和 sklearn 使用该词 eval_metricxgboost的作者为了方便理解,保留了变量的名称,并在内部做了这个转换。

希望对您有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.