我正在努力优化 LSTM NN,让我解释一下我想要做什么:)
--> 我有一个数据集,可以说自 2015 年以来我所在位置的每日温度。
--> 我想根据最后 30 天的温度预测明天的温度。
所以基本上我所做的是一个有 31 列和 2k 行的熊猫表。每行代表 31 天期间的温度
[[18.5, 19.6, 15.2, 16.3 ... 12.4, 13.2]
[19.6, 15.2, 16.3, 12.6 ... 13.2, 15.5]
[......]]
然后我创建了同一张表,但与前一天相比,每天的温度变化百分比
然后,我将表的前 30 行隔离为输入,最后一行作为结果。因此,我尝试根据最后几天的百分比变化来预测明天温度的百分比变化。
所以我写了这段代码:
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt
def visualize_training_results(results):
history = results.history
plt.figure(figsize=(12, 4))
plt.plot(history['loss'])
plt.title('Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.show()
data_delta = [] data_base = pd.read_csv('data.csv')
length_data_base = len(data_base) for i in range(1, (length_data_base
- 1)):
data_delta.append(round(((data_base.iloc[(i), 5]) - (data_base.iloc[(i - 1), 5])) / (data_base.iloc[(i - 1), 5]) * 100, 4))
training_set = pd.DataFrame([], columns= ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 'outputs'])
for j in range(31, (length_data_base - 1)):
data_train = pd.Series(data_delta[j - 31:j], index = training_set.columns)
training_set = training_set.append(data_train, ignore_index = True)
training_data = training_set.drop(training_set.columns[[30]], axis='columns') training_labels = training_set.pop('outputs')
training_data_model = np.array(training_data) training_labels_model = np.array(training_labels)
training_data_model = training_data_model.reshape(len(training_data_model), 30, 1)
data_model = tf.keras.Sequential([
layers.LSTM(30, return_sequences=True, activation= 'relu' , input_shape=(30,1)),
layers.Dense(12, activation= 'relu'),
layers.Dense(12, activation= 'relu'),
layers.LSTM(10, activation= 'relu'),
layers.Dense(1) ])
data_model.compile(loss = tf.losses.MeanSquaredError(),
optimizer = tf.optimizers.Adam()) data_model.summary()
results = data_model.fit(training_data_model, training_labels_model, batch_size = 300, epochs=10000)
visualize_training_results(results)
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 30, 30) 3840
_________________________________________________________________
dense (Dense) (None, 30, 12) 372
_________________________________________________________________
dense_1 (Dense) (None, 30, 12) 156
_________________________________________________________________
lstm_1 (LSTM) (None, 10) 920
_________________________________________________________________
dense_2 (Dense) (None, 1) 11
=================================================================
Total params: 5,299
Trainable params: 5,299
Non-trainable params: 0
起初它工作得很好,但在 5000 epoch 之后我有一个巨大的峰值,它永远不会回到低水平的损失。
这是我的损失与时代的图片
我的数据集中的 % 范围从 -37 到 +42,很多值都在 0 左右,我尝试对其进行标准化,但使用 minmaxscaler 使我的数据丢失了很多粒度,我希望能够预测 40%即使大多数日子变化仅为 0-3%,也会增加。
我在这里做错了什么?NN 的架构对我正在尝试做的事情有好处吗?我应该设置不同的学习率吗?
PS:我是初学者,所以我可能做错了事情:D。
先感谢您 !