我注意到 Python 中的 XGBoost 有两种可能的实现,如所讨论的 here和 here
当我尝试通过两种可能的实现运行相同的数据集时,我注意到结果不同。
代码
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
最佳答案
确保随机种子相同。
对于两种方法设置相同的种子
param['seed'] = 123
编辑:然后有一些不同的事情。 首先n_estimators也是200吗?您是否也将第二个数据集中的缺失值归为 0?其他默认值是否也相同(对于这个,我认为是的,因为它是一个包装器,但检查其他两件事)
关于python - 在某些情况下,Python 中 xgb.train 和 xgb.XGBRegressor 之间的差异是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395651/