Python回归模型预测值与实际值绘图不符合预期问题求解
问题原因分析
1. OLS模型未添加截距项导致系统偏差
你使用statsmodels.OLS建模时没有给特征矩阵添加常数截距项,默认拟合的是过原点的线性模型,而你的输入特征经过MinMaxScaler归一化后取值范围在[0,1]区间,缺少截距项会直接导致模型预测结果存在系统性偏移,无法拟合标签的整体均值水平。
修正方法:
import statsmodels.api as sm X_train = sm.add_constant(X_train) X_test = sm.add_constant(X_test) ols_regressor = sm.OLS(y_train, X_train).fit()
2. 坐标轴尺度设置错误误导判断
- 残差图的纵轴范围固定为[-0.03, 0.03],但你的模型预测值范围远小于该区间:线性回归预测值区间仅为[-0.005, 0.0005],残差的绝对值和预测值本身的量级相当甚至更大,你视觉上看到残差贴合水平线,仅能说明残差和预测值没有趋势性关联,不代表残差本身的数值小、预测精度高。极端情况下如果所有样本预测值都是同一个常数,残差图也会呈现水平分布,但预测完全没有区分度。
- 预测值与实际值对比图的x轴(预测值)和y轴(真实值)范围完全不对等,比如线性回归的x轴范围跨度仅为0.004左右,y轴范围跨度是0.06,二者刻度比例不同,此时绘制的45度线完全不具备完美预测的参考意义。你需要保证同一张图的x轴和y轴范围完全一致:
# 通用修正代码,替换原有硬编码的x0/x1/y0/y1设置 import numpy as np all_values = np.concatenate([y_test, y_pred]) min_val, max_val = all_values.min(), all_values.max() axes[0].set_xlim(min_val, max_val) axes[0].set_ylim(min_val, max_val) axes[0].plot([min_val, max_val], [min_val, max_val], ls="--", c="grey")
3. 模型整体欠拟合,输出范围受限
从图中可以看到三个模型的预测值范围都远小于真实标签的范围,说明所有模型都没有学到特征和标签之间的真实关联,仅能输出一个波动很窄的结果,自然会远离45度线。可能的原因包括:
- 神经网络训练流程有问题:比如标签未做归一化、输出层激活函数选择错误、训练轮次不足等,你当前的神经网络预测值全部落在[-0.018, -0.009]的极小区间,明显没有拟合到标签的波动。
- 特征和标签之间本身的相关性很低,可解释性差,模型上限本身就很低。
- 随机森林的参数设置不合理:比如max_features=3如果你的特征总数很少也会限制模型拟合能力。
4. 误区纠正
残差图呈水平分布仅能说明模型的误差不存在随预测值变化的趋势,不存在异方差问题,是模型拟合良好的必要非充分条件,不能单独用来证明模型预测精度高。
内容的提问来源于stack exchange,提问作者Joehat
相关产品推荐
相关产品推荐

