1

我正在努力优化 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 之后我有一个巨大的峰值,它永远不会回到低水平的损失。

这是我的损失与时代的图片 5000 epoch 后的峰值

我的数据集中的 % 范围从 -37 到 +42,很多值都在 0 左右,我尝试对其进行标准化,但使用 minmaxscaler 使我的数据丢失了很多粒度,我希望能够预测 40%即使大多数日子变化仅为 0-3%,也会增加。

我在这里做错了什么?NN 的架构对我正在尝试做的事情有好处吗?我应该设置不同的学习率吗?

PS:我是初学者,所以我可能做错了事情:D。

先感谢您 !

4

0 回答 0