在某些情况下,Python 中 xgb.train 和 xgb.XGBRegressor 之间的差异是值

Posted

技术标签:

【中文标题】在某些情况下,Python 中 xgb.train 和 xgb.XGBRegressor 之间的差异是值【英文标题】:Difference is value between xgb.train and xgb.XGBRegressor in Python for certain cases 【发布时间】:2020-04-11 05:17:08 【问题描述】:

我注意到在 here 和 here 中讨论过的 Python 中有两种可能的 XGBoost 实现

当我尝试通过两种可能的实现运行相同的数据集时,我注意到结果不同。

代码

import xgboost as xgb
from xgboost.sklearn import XGBRegressor
import xgboost
import pandas as pd
import numpy as np
from sklearn import datasets

boston_data = datasets.load_boston()
df = pd.DataFrame(boston_data.data,columns=boston_data.feature_names)
df['target'] = pd.Series(boston_data.target)

Y = df["target"]
X = df.drop('target', axis=1)

#### Code using Native Impl for XGBoost
dtrain = xgboost.DMatrix(X, label=Y, missing=0.0)
params = 'max_depth': 3, 'learning_rate': .05, 'min_child_weight' : 4, 'subsample' : 0.8
evallist = [(dtrain, 'eval'), (dtrain, 'train')]

model = xgboost.train(dtrain=dtrain, params=params,num_boost_round=200)

predictions = model.predict(dtrain)

#### Code using Sklearn Wrapper for XGBoost
model = XGBRegressor(n_estimators = 200, max_depth=3, learning_rate =.05, min_child_weight=4, subsample=0.8 )

#model = model.fit(X, Y, eval_set = [(X, Y), (X, Y)], eval_metric = 'rmse', verbose=True)
model = model.fit(X, Y)

predictions2 = model.predict(X)

print(np.absolute(predictions-predictions2).sum())

使用 sklearn boston 数据集的绝对差和

62.687134

当我对 sklearn 糖尿病数据集等其他数据集运行相同的数据时,我发现差异要小得多。

使用 sklearn 糖尿病数据集的绝对差和

0.0011711121

【问题讨论】:

另一个观察结果是,当我使用具有负值和正值的单个稀疏特征进行训练时,这些值似乎不匹配。 【参考方案1】:

确保随机种子相同

为这两种方法设置相同的种子

param['seed'] = 123

编辑:那么有几个不同的东西。 首先是 n_estimators 也是 200?您是否也将第二个数据集中的缺失值设为 0?其他默认值是否也相同(对于这个我认为是的,因为它是一个包装器,但请检查其他两件事)

【讨论】:

我尝试在两种情况下设置相同的种子,发现仍然存在非零差异。在这两种情况下,估计器的数量也是 200,我用一个没有缺失值的数据集进行了测试,发现仍然存在差异。【参考方案2】:

我没有为 sklearn 实现设置“缺失”参数。一旦设置好,值就会匹配。

也正如 Noah 所指出的,sklearn 包装器有几个不同的默认值需要匹配才能完全匹配结果。

【讨论】:

以上是关于在某些情况下,Python 中 xgb.train 和 xgb.XGBRegressor 之间的差异是值的主要内容,如果未能解决你的问题,请参考以下文章

设置 XGBoost 提前停止的 Tol

Python Argparse 条件需要的参数

为啥回顾中的有限重复在某些情况下不起作用?

在没有身份验证令牌的情况下使用 Python 和 Twitter API

在哪些情况下可以接受不将导入放在 Python 的顶部? [复制]

在某些情况下,从JSON中删除属性