XGBoost在波士顿数据集训练得到负R2,如何排查问题并修复?
问题原因定位
- 正则化强度过高:你设置的
alpha=10为L1正则项权重,该值对于波士顿房价数据集来说过大,会强制压缩树的叶子节点权重,导致模型几乎无法学习有效特征规律。从输出结果可以看到训练集真实标签均值为22.6,模型预测均值仅为14.6,预测值整体被大幅压低,直接导致效果不如直接输出均值的朴素策略,因此R2为负。 - 迭代次数不足:
n_estimators=10仅配置了10棵树,搭配0.1的学习率,模型还未拟合到基础的数据分布就停止训练,没有足够的迭代次数学习特征和标签的映射关系。 - 次优参数影响:
colsample_bytree=0.3限制每棵树仅能使用30%的特征,进一步降低了单轮迭代的拟合效率,放大了前两个问题的影响。
修复方案
按照以下优先级调整参数即可解决问题:
- 降低正则强度:将alpha调整到0~2的区间,也可先设置为0关闭L1正则,验证模型可正常拟合后再逐步调整正则参数控制过拟合。
- 提升迭代次数:将n_estimators调整到100500的常规区间,搭配0.050.1的学习率即可保证模型有足够的迭代次数拟合数据。
- 调整特征采样比例:将colsample_bytree调整到0.7~1的区间,提升单棵树的拟合能力。
调整后的参考代码如下:
xg_reg = xgb.XGBRegressor( objective ='reg:squarederror', colsample_bytree=0.8, learning_rate = 0.1, max_depth=5, alpha=1, n_estimators=200 ) xg_reg.fit(X_train,y_train) y_train_hat = xg_reg.predict(X_train) train_r2 = metrics.r2_score(y_true=y_train, y_pred=y_train_hat) train_rmse = np.sqrt(mean_squared_error(y_train, y_train_hat)) print(train_r2, train_rmse, y_train.mean(), y_train_hat.mean())
调整后训练集R2可以达到和随机森林接近的水平,后续可通过交叉验证进一步调参优化样本外表现。
内容的提问来源于stack exchange,提问作者user623949
相关产品推荐
相关产品推荐

