我已经知道"xgboost.XGBRegressor
是XGBoost的Scikit Learn Wrapper接口。">
但它们还有其他区别吗?
xgboost.train
是通过梯度提升方法训练模型的低级API。
xgboost.XGBRegressor
和xgboost.XGBClassifier
是准备DMatrix
并传入相应目标函数和参数的包装器(Scikit Learn-like wrappers,正如他们所称)。最后,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)
这意味着可以用XGBRegressor
和XGBClassifier
完成的一切都可以通过底层xgboost.train
函数实现。另一种方式显然不是真的,例如xgboost.train
的一些有用参数在XGBModel
API中不受支持。显著差异列表包括:
xgboost.train
允许设置在每次迭代结束时应用的callbacks
xgboost.train
允许通过xgb_model
参数继续训练xgboost.train
不仅允许eval函数的最小化,还允许最大化
@Maxim,截至xgboost 0.90(或更早),这些差异在该xgboost。XGB分类器.fit:
- 具有
callbacks
- 允许使用
xgb_model
参数继续 - 并且支持相同的内置eval度量或自定义eval函数
我发现evals_result
的不同之处在于,它必须在拟合后单独检索(clf.evals_result()
),并且生成的dict
不同,因为它不能利用观察列表中评估值的名称(watchlist = [(d_train, 'train'), (d_valid, 'valid')]
)。
在我看来,主要区别在于训练/预测速度。
为了进一步参考,我将把xgboost.train
称为"本机实现"和XGBClassifier.fit
称为"sklearn_wrapper">
我已经对数据集形状(240000,348)进行了一些基准测试
装配/训练时间:sklearn_wrapper
时间=89秒native_implementation
时间=7秒
预测时间:sklearn_wrapper
=6秒native_implementation
=3.5毫秒
我相信这是因为sklearn_wrapper
被设计为使用pandas/numpy对象作为输入,其中native_implementation
需要将输入数据转换为xgboost。DMatrix对象。
此外,可以使用native_implementation
来优化n_估计器。
@Danil提出了速度上的显著差异,@Mohammad正确地指出了将数据转换为DMatrix结构的必要性。因此,我尝试在Kaggle笔记本电脑环境中复制基准测试。
结果表明,CCD_ 32和CCD_。
编辑:根据评论中的建议添加基准代码
import numpy as np
import xgboost as xgb
xgb.__version__
"1.6.1">
# training data
X = np.random.rand(240000, 348)
y = np.random.rand(240000)
基准xgboost本机实现
```python
%%time
# convert training data
dtrain = xgb.DMatrix(X, label=y)
CPU times: user 3.61 s, sys: 505 ms, total: 4.12 s
Wall time: 1.56 s
```python
%%time
# train the model with default parameters
model = xgb.train({'objective':'reg:squarederror'},dtrain,10)
CPU时间:用户6min 8s,系统:700 ms,总计:6min 9s
壁时间:1min 34s
%%time
# predict with trained model
prediction = model.predict(dtrain)
CPU时间:用户818毫秒,系统:1.01毫秒,总计:819毫秒
墙时间:209毫秒
XGBoost的Benchmark Scikit Learn Wrapper接口
%%time
model = xgb.XGBRegressor(n_estimators=10)
model.fit(X,y)
CPU时间:用户6min 15s,系统:1.2s,总计:6min 16s
壁时间:1min 37s
XGB回归器(base_score=0.5,booster='btree',callbacks=None,colsample_bylevel=1,colsample_bynode=1,colsample_bytree=1,early_stopping_rounds=无,enable_categorical=错误,eval_metric=None,gamma=0,gpu_id=-1,growt_policy='depthwise',importance_type=None,interaction_contraints='',learning_rate=0.3000000012,max_bin=256,max_cat_to_nonehot=4,max_delta_step=0,max_depth=6,max_leave=0,min_child_weight=1,missing=nan,单调约束='()',n_estimulations=10,n_jobs=0,num_parallel_tree=1,predictor='auto',random_state=0,reg_alpha=0,reg_lambda=1,…)
%%time
prediction_1 = model.predict(X)
CPU时间:用户1.48秒,系统:1.99毫秒,总计:1.48秒
壁时间:380毫秒