xgb.train 和 xgb.XGBRegressor(或 xgb.XGBClassifier)有什么区别?

What is the difference between xgb.train and xgb.XGBRegressor (or xgb.XGBClassifier)?

我已经知道“xgboost.XGBRegressor 是 XGBoost 的 Scikit-Learn 包装器接口。”

但是它们还有什么不同吗?

xgboost.train 是底层 API 通过梯度提升方法训练模型。

xgboost.XGBRegressorxgboost.XGBClassifier 是准备 DMatrix并传入相应的objective函数和参数。最后,fit 调用简单地归结为:

self._Booster = train(params, dmatrix,
                      self.n_estimators, evals=evals,
                      early_stopping_rounds=early_stopping_rounds,
                      evals_result=evals_result, obj=obj, feval=feval,
                      verbose_eval=verbose)

这意味着 一切 可以用 XGBRegressorXGBClassifier 完成的事情都可以通过基础 xgboost.train 函数来完成。反过来显然不是这样,例如,XGBModel API 不支持 xgboost.train 的一些有用参数。显着差异列表包括:

  • xgboost.train 允许设置在每次迭代结束时应用的 callbacks
  • xgboost.train 允许通过 xgb_model 参数继续训练。
  • xgboost.train 不仅允许 eval 函数的最小化,还允许最大化。

@Maxim,从 xgboost 0.90(或更早)开始,这些差异不再存在 xgboost.XGBClassifier.fit:

  • callbacks
  • 允许使用 xgb_model 参数继续
  • 并支持相同的内置评估指标或自定义评估函数

我发现不同的是evals_result,因为它必须在fit(clf.evals_result())之后单独检索并且结果dict是不同的,因为它不能带利用观察列表中评估的名称 ( watchlist = [(d_train, 'train'), (d_valid, 'valid')] ) .

在我看来,主要区别在于 training/prediction 速度。

为了进一步参考,我将调用 xgboost.train - 'native_implementation' 和 XGBClassifier.fit - 'sklearn_wrapper'

我已经在数据集形状 (240000, 348) 上做了一些基准测试

Fit/train时间: sklearn_wrapper时间=89秒 native_implementation时间=7秒

预测时间: sklearn_wrapper = 6 秒 native_implementation = 3.5 毫秒

我认为这是因为 sklearn_wrapper 旨在使用 pandas/numpy 对象作为输入,其中 native_implementation 需要将输入数据转换为 xgboost.DMatrix对象。

此外,可以使用 native_implementation.

优化 n_estimators