为何XGBoost.Regressor在CPU与GPU环境下MAE结果差异显著?
问题:XGBoost+Optuna在CPU与GPU环境下MAE指标差异大的原因?
我正在用Optune寻找XGBoost.Regressor的最优配置,在本地CPU环境(显卡不支持机器学习)和Kaggle的GPU环境分别运行代码,相同参数下得到的MAE指标差异极大。已在Kaggle执行!conda update --all -q -y更新所有包,想知道差异原因。
运行代码
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环境最优试验结果:
Best is trial 48 with value: 1.1957438226176318. - Kaggle GPU环境最优试验结果:
Best is trial 43 with value: 1.351620287489423.
可能的原因分析
- 树构建算法的默认差异:你代码里注释掉了
tree_method='gpu_hist',但GPU环境下XGBoost会自动启用GPU加速的树构建算法(gpu_hist),而CPU环境默认用hist或exact。这两种算法在直方图分箱、样本分割的细节实现上有精度差异,会直接影响模型的结构和预测结果。 - 随机逻辑的硬件差异:虽然指定了
random_state,但CPU和GPU的随机数生成器实现逻辑不同。子采样(subsample)、列采样(colsample_bytree)这些带随机操作的步骤,在GPU上生成的随机序列和CPU不一致,导致每轮训练的样本/特征选择不同,最终模型走向不同。 - 浮点运算精度差异:GPU通常默认用单精度(float32)计算,CPU则多用双精度(float64)。训练过程中大量的浮点运算累计误差会逐步放大,影响模型的权重更新和最终预测值,进而导致MAE差异。
- 早停机制的触发差异:GPU训练速度远快于CPU,验证集指标的计算时机和精度可能和CPU有细微差别,导致early stopping触发的轮数不同。最终模型的迭代次数不一样,MAE自然会有明显差距。
内容的提问来源于stack exchange,提问作者Linxusr
相关产品推荐
相关产品推荐

