XGBoost回归算法对不同输入实例输出相同预测结果问题排查
问题原因及修复方案
1. 核心错误:特征预处理逻辑不一致
你训练模型时传入的训练集特征X_train是原始数值,没有做对数变换,但预测自定义样本时,特意对输入特征做了np.log(X_data)处理,两者特征分布完全不匹配,模型无法识别输入特征,自然只能输出接近训练集标签均值的固定结果。
2. 次要错误:评估逻辑存在多处问题
- 你注释了原始测试集的预测代码,后续计算
MSE_test、R²时,用单样本的预测结果和整个测试集的真实值计算,结果完全没有参考价值 r2_score的参数顺序写反,sklearn要求传入顺序为r2_score(真实值, 预测值),你写反后得到的R²结果完全错误- 传入XGBoost的标签
y_train_log是二维数组,XGBoost要求标签为一维数组,格式不匹配可能导致训练异常
其他排查方向
- 先检查训练集的预测结果和
MSE_train数值,如果训练集MSE很高,说明模型完全没有拟合成功:- 检查标签
running_time是否存在零值/负数,导致np.log计算得到inf/nan,训练失效 - 查看数据集标签分布,是否存在大量样本的
running_time接近0.7,导致模型直接学习全局均值 - 可以调整XGBoost的
learning_rate参数,默认学习率过高或过低都可能导致拟合失败
- 检查标签
修正后核心代码片段
# 训练部分修正:展平标签为一维数组 y_train_log = np.log(y_train).ravel() y_test_log = np.log(y_test).ravel() xgb_depth_conv = xgb.XGBRegressor( objective ='reg:squarederror', n_estimators = 1000, learning_rate = 0.01, # 新增学习率参数,可根据拟合效果调整 seed = 123, tree_method = 'hist', max_depth=10 ) xgb_depth_conv.fit(X_train, y_train_log) # 预测部分修正:特征和训练逻辑对齐,不额外做对数变换 X_data=[[8,576,3,2]] y_pred_test = xgb_depth_conv.predict(X_data) print(np.exp(y_pred_test)) # 评估部分修正:使用测试集的预测结果计算指标,参数顺序对齐 y_pred_test_origin = xgb_depth_conv.predict(X_test) MSE_test = mse(y_test_log, y_pred_test_origin) MSE_train = mse(y_train_log, xgb_depth_conv.predict(X_train)) R_squared = r2_score(y_test_log, y_pred_test_origin) print("MSE-Train = {}".format(MSE_train)) print("MSE-Test = {}".format(MSE_test)) print("R-Squared: ", np.round(R_squared, 2))
内容的提问来源于stack exchange,提问作者Mazia
相关产品推荐
相关产品推荐

