我正在使用 optune 寻找更好的 XGBoost.regressor 选项。我有一个在本地计算机上运行的笔记本电脑实例(在处理器上,我的显卡不支持机器学习),一个在 Kaggle 代码上运行(在 GPU 100 上)。并且使用相同的参数我得到不同的指标,它们是非常不同的。 这是代码:
def objective(trial, data=data, target=target):
train_x, test_x, train_y, test_y = train_test_split(data, target, test_size=0.15, random_state=SEED) #, random_state=1234
param = {
'objective': 'reg:squarederror',
'booster': 'gbtree',
'eval_metric': 'mae',
# tree_method':'gpu_hist', # this parameter means using the GPU when training our model to speedup the training process
'lambda': trial.suggest_float('lambda', 1e-3, 13.0), # old value 10.0
'alpha': trial.suggest_float('alpha', 1e-3, 13.0), # old value 10.0
'colsample_bytree': trial.suggest_categorical('colsample_bytree', [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]),
'subsample': trial.suggest_categorical('subsample', [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]), # added 0.3
'learning_rate': trial.suggest_categorical('learning_rate', [0.006, 0.008, 0.01, 0.012 ,0.014, 0.016, 0.018, 0.02]), # added 0.006
'n_estimators': 50000, # old 10000
'max_depth': trial.suggest_categorical('max_depth', [5, 7, 9, 11, 13, 15, 17, 19]), # added 19
'random_state': trial.suggest_categorical('random_state', [SEED]),
'min_child_weight': trial.suggest_int('min_child_weight', 1, 500), # old max value=300
'early_stopping_rounds': 500, # old 100
}
model = xgb.XGBRegressor(**param)
model.fit(train_x, train_y, eval_set=[(test_x, test_y)], verbose=2000)
xgb_preds = model.predict(test_x)
mae = mean_absolute_error(test_y, xgb_preds)
return mae
在本地 CPU 上,我得到“最好是试用 48,其值:1.1957438226176318”。 在具有 GPU100 的 Kaggle Code 笔记本上,我得到 - “最好的是试验 43,其值:1.351620287489423。”
为什么我得到不同的结果?在笔记本上的 Kaggle 代码中,我使用以下命令更新了软件包:
!conda update --all -q -y
看来XGBoost在使用GPU或CPU时使用了不同的采样方法。
查看
scikit-learn API文档中的
sampling_method
。
采样方法 –
抽样方法。仅由 GPU 版本的 hist 树方法使用。 uniform:统一选择随机训练实例。
gradient_based 选择具有更高梯度的随机训练实例 梯度和hessian较大时的概率。 (参见 CatBoost)