
本文为365天深度学习训练营中的学习记录博客原作者K同学啊LSTM 时间序列预测笔记这次主要是用 LSTM 做一个时间序列预测数据是类似传感器的连续数据温度、CO、烟尘。整体流程其实就是比较典型的深度学习流程但里面有几个点还是挺值得记下来的。一开始读数据 看数据先把数据读进来df_1 pd.read_csv(./data/woodpine2.csv)然后画了三条曲线温度Tem1COCO 1烟尘Soot 1其实一开始我有点忽略这一步但后来发现这一步挺重要的。因为可以大概看出数据有没有趋势波动大不大有没有明显异常如果一开始不看后面模型效果不好也不知道是模型问题还是数据问题。数据预处理最关键的一部分1. 去掉时间列dataFrame df_1.iloc[:, 1:]第一列应该是时间对模型没用就直接去掉了。2. 滑动窗口这里是整个代码最核心的地方。设定width_X 8 width_y 1意思是用前 8 个时间点 → 预测第 9 个我一开始有点没理解这个过程其实本质就是把时间序列变成监督学习问题。比如t1~t8 → t9t2~t9 → t10一直这样往后滑3. 构造 X 和 y这部分是用循环做的for _, _ in df_1.iterrows():然后每一段切出来X_ dataFrame.iloc[in_start:in_end] y_ dataFrame.iloc[in_end:out_end, 0]这里有一个细节X_ X_.reshape(len(X_) * 3)就是把原来的 (8,3) 拉平成 (24,)我当时有点疑惑为什么要这样其实是为了后面用 scaler 做归一化。之后又 reshape 回 (8,3)。最后得到X.shape (5939, 24)y.shape (5939, 1)归一化sc MinMaxScaler(feature_range(0, 1)) X_scaled sc.fit_transform(X)这个步骤基本是必须的。不归一化的话不同特征量纲不一样模型很难训练loss 会很奇怪然后 reshape 成 LSTM 要的格式X_scaled X_scaled.reshape(5939, 8, 3)这个格式我现在基本记住了(样本数, 时间步, 特征数)划分训练集和测试集X_train X_scaled[:5000] X_test X_scaled[5000:]这里有一个很重要的点时间序列不能乱打乱只能按顺序切否则就相当于“用未来预测过去”会数据泄露。LSTM 模型模型结构其实不复杂model.add(LSTM(64, return_sequencesTrue)) model.add(LSTM(64)) model.add(Dense(1))两层 LSTM 一层全连接。有个点需要注意第一层必须加return_sequencesTrue不然第二层 LSTM 接不上。训练model.fit( X_train, y_train, epochs40, batch_size64, validation_data(X_test, y_test) )训练的时候主要看 loss 和 val_loss。看 loss 曲线plt.plot(history[loss]) plt.plot(history[val_loss])这一步挺有用的。如果出现train loss 一直下降val loss 开始上升基本就是过拟合了。预测结果predicted model.predict(X_test)然后画真实值 vs 预测值plt.plot(y_test) plt.plot(predicted)这个图其实比指标更直观。模型评估用了两个指标RMSE和R²R² 大概 0.83说明模型已经能解释大部分变化了。