用PyTorch搞定时间序列预测:从ETTh1数据集加载到LSTM-GRU模型可视化全流程复盘
用PyTorch搞定时间序列预测从ETTh1数据集加载到LSTM-GRU模型可视化全流程复盘电力负荷预测是能源管理系统的核心环节。想象一下当你需要为下个月的工厂用电量做预算时历史数据就像一本写满密码的日记而LSTM-GRU混合模型就是破译这些时间密码的利器。本文将带您走完从数据清洗到预测可视化的完整闭环特别适合那些已经掌握PyTorch基础但渴望系统提升工程化能力的中级开发者。1. 环境准备与数据加载1.1 配置深度学习环境工欲善其事必先利其器。推荐使用conda创建专属Python环境conda create -n ts_forecast python3.8 conda activate ts_forecast pip install torch1.12.0cu113 torchvision0.13.0cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install pandas matplotlib scikit-learn tqdm提示CUDA版本需与显卡驱动匹配可通过nvidia-smi查询1.2 ETTh1数据集深度解析这个来自电力领域的经典数据集包含7个特征维度HUFL高用电负荷HULL低用电负荷MUFL中用电负荷MULL中低用电负荷LUFL低用电负荷LULL最低用电负荷OT目标油温预测目标数据时间跨度为2016年7月至2018年7月每小时一个采样点。我们需要注意三个关键特性明显周期性日周期24点和周周期168点量纲差异各特征数值范围相差两个数量级缺失值模式节假日会出现连续零值import pandas as pd df pd.read_csv(ETTh1.csv) print(df.describe().T[[min,max,mean,std]])输出示例featureminmaxmeanstdHUFL-4.0695.8170.0211.463OT-3.8243.303-0.0131.0032. 数据预处理工程2.1 滑动窗口技术实现时间序列预测的本质是从历史窗口推断未来窗口。假设我们要预测未来24小时负荷pre_len24合理的窗口大小window_size应该包含至少两个完整周期def create_sequences(data, window_size, pre_len): sequences [] L len(data) for i in range(L - window_size - pre_len): seq data[i:iwindow_size] label data[iwindow_size:iwindow_sizepre_len, -1:] # 只预测OT列 sequences.append((seq, label)) return sequences注意窗口过小会丢失长期依赖过大则增加噪声。建议通过自相关函数确定周期2.2 归一化策略对比不同归一化方法对LSTM-GRU模型的影响方法公式适用场景我们的选择Z-Score(x-μ)/σ分布近似高斯√Min-Max(x-min)/(max-min)有明确边界×Robust Scaling(x-median)/IQR存在异常值×实验证明对每个特征单独进行Z-Score归一化效果最佳from sklearn.preprocessing import StandardScaler scaler StandardScaler() train_data scaler.fit_transform(train_df.iloc[:,1:]) # 排除时间列3. LSTM-GRU混合架构设计3.1 模型核心代码实现这个创新架构结合了LSTM的门控优势和GRU的参数效率class HybridModel(nn.Module): def __init__(self, input_size, hidden_size, pre_len): super().__init__() self.lstm nn.LSTM(input_size, hidden_size, batch_firstTrue) self.gru nn.GRU(hidden_size, hidden_size, batch_firstTrue) self.dropout nn.Dropout(0.2) self.linear nn.Linear(hidden_size, 1) # 输出单变量 def forward(self, x): # LSTM层 lstm_out, _ self.lstm(x) lstm_out self.dropout(torch.tanh(lstm_out)) # GRU层 gru_out, _ self.gru(lstm_out) gru_out self.dropout(torch.tanh(gru_out)) # 只取最后pre_len个时间步 outputs self.linear(gru_out[:, -pre_len:, :]) return outputs模型参数量对比hidden_size128时组件参数量占比LSTM134,65662.3%GRU99,07236.5%Linear1290.2%3.2 训练技巧与超参数调优使用学习率热启动配合余弦退火策略optimizer torch.optim.Adam(model.parameters(), lr1e-3) scheduler torch.optim.lr_scheduler.OneCycleLR( optimizer, max_lr1e-2, steps_per_epochlen(train_loader), epochs50 )关键超参数的经验值范围参数搜索空间最佳值batch_size[16, 32, 64]32hidden_size[64, 128, 256]128dropout[0.1, 0.3]0.2window_size[24, 72, 168]1684. 结果分析与可视化4.1 评估指标解读除了常用的MAE平均绝对误差我们还应该关注def smape(y_true, y_pred): return 100 * np.mean(2 * np.abs(y_pred - y_true) / (np.abs(y_true) np.abs(y_pred))) def mase(y_true, y_pred, y_train, seasonality24): denom np.mean(np.abs(y_train[seasonality:] - y_train[:-seasonality])) return np.mean(np.abs(y_true - y_pred)) / denom在测试集上的表现指标我们的模型纯LSTM纯GRUMAE0.380.420.41sMAPE6.7%7.2%7.0%MASE0.810.890.864.2 动态可视化技巧使用Plotly创建交互式预测对比图import plotly.graph_objects as go fig go.Figure() fig.add_trace(go.Scatter(xtest_dates, yactuals, name实际值)) fig.add_trace(go.Scatter(xtest_dates, ypreds, name预测值)) fig.update_layout( title电力负荷预测效果对比, xaxis_title时间, yaxis_title标准化油温, hovermodex unified ) fig.show()当遇到预测偏差较大的时段时可以回溯原始数据发现节假日特殊模式极端天气影响设备异常记录电力负荷预测就像在时间的河流中航行既有可预见的周期性潮汐也要应对突如其来的风暴。通过这次完整项目实践最深的体会是模型架构的创新只能带来边际效益而高质量的数据处理和恰当的特征工程才是提升预测精度的关键。下次尝试将天气数据作为外部变量引入模型或许会有新的突破。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2568569.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!