You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:45:06