如何解决Pytorch神经网络训练欠拟合问题:工厂功耗预测案例
欠拟合问题根因及解决方案
核心根因(优先级最高)
你当前的问题90%以上来自数据读取逻辑完全错误:
- 你提到CSV每行是1天的样本,前7列为当日特征、最后1列为当日电力消耗,即数据维度为
360行 * 8列 - 但代码里你用
iloc[0:7, 1:301]取前7行、300列数据,之后再转置,相当于把「7个特征的时间序列值」当成了样本,完全颠倒了样本和特征的维度,模型根本无法学到特征和标签的对应关系,最终只能输出接近标签均值的固定值,也就是你看到的直线。
次高优先级问题
无特征归一化/标准化
7项日常运行特征的量纲、数值范围差异极大(比如温度是0~40的量级,产量可能是上万的量级),不做归一化直接喂入模型,会导致梯度更新方向完全被数值大的特征主导,小数值特征的信号完全被淹没,模型无法学到有效规律。
模型容量与训练逻辑错误
- RNN隐藏层维度仅为3,模型容量极低,完全不足以拟合时序规律
- RNN训练时每个batch都重置hidden state,截断了时序依赖关系
- 线性模型使用SGD优化器的学习率0.0001过低,训练1000轮也无法完成有效收敛
- 测试时使用自回归预测(前一步的预测值作为下一步输入),误差持续累积,进一步放大了预测偏差
分步解决方案
第一步:修正数据读取逻辑
# 正确读取,每行是1个样本 all_features = initialData.iloc[:, :7].values all_labels = initialData.iloc[:, 7].values.reshape(-1, 1) # 拆分训练测试集 train_X, test_X = all_features[:300], all_features[300:] train_y, test_y = all_labels[:300], all_labels[300:]
不需要做任何转置操作,确认训练集维度为 (300,7)、标签维度为 (300,1) 后再进行后续操作。
第二步:添加特征归一化
from sklearn.preprocessing import StandardScaler # 只用训练集的统计量做归一化,避免数据泄露 x_scaler = StandardScaler() y_scaler = StandardScaler() train_X = x_scaler.fit_transform(train_X) test_X = x_scaler.transform(test_X) train_y = y_scaler.fit_transform(train_y) test_y = y_scaler.transform(test_y) # 预测完成后用y_scaler.inverse_transform()转回原单位即可
第三步:调优模型与训练参数
- 优先调通全连接模型:将优化器换成Adam,学习率设置为
1e-3,隐藏层维度调整为64/128,先保证训练集Loss能持续下降到较低水平,确认模型具备拟合能力 - 若要使用时序模型:将RNN替换为LSTM,隐藏层维度调到
32以上,序列长度设置为7~14天,batch size调到8~16,训练时仅在每个epoch开始时重置一次hidden state,测试时先用地真值特征做预测,确认模型有效后再尝试自回归预测。
内容的提问来源于stack exchange,提问作者non_address
相关产品推荐
相关产品推荐

