lstm单变量单步预测

数据展示,利用dataframe.WetBulbCelsius.values读取即可。

一,数据读取

        使用pandas将dataframe二维格式的某一列直接读取出来即可。

import numpy as np
import pandas as pd
data=pd.read_csv('re.csv')
seq_test=data['WetBulbCelsius'].values

 二,时间窗口滑动生成数据集

def split_sequence(sequence, look_back):
    X, y = [], []
    for i in range(len(sequence)):
        # 找到最后一次滑动所截取数据中最后一个元素的索引,
        # 如果这个索引超过原序列中元素的索引则不截取;
        end_element_index = i + look_back
        if end_element_index > len(sequence) - 1: # 序列中最后一个元素的索引
            break
        sequence_x, sequence_y = sequence[i:end_element_index], sequence[end_element_index] # 取最后一个元素作为预测值y
        X.append(sequence_x)
        y.append(sequence_y)
    
    #return X,y
    return np.array(X), np.array(y)


#look_back参照历史多长的数据长度,一般作为的是LSTM(input_shape=(look_back,1)),这里的1表示一个特征,out_put为(None,look_back,1)),None表示batch_size未定
look_back = 3
seq_test_x, seq_test_y = split_sequence(seq_test, look_back)

 三,二维到三维转换

        添加samples到数据维度中。seq_test_x.shape[0]表示总共的序列长度。

seq_test_x_1 = seq_test_x.reshape((seq_test_x.shape[0], look_back, 1))

四,模型搭建

from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.callbacks import LearningRateScheduler
from keras import backend as K

#-----------------------------------------------
model = Sequential()
model.add(LSTM(32, input_shape=(look_back, 1),return_sequences=True,activation='relu'))
model.add(LSTM(16, activation='relu'))
model.add(Dense(8))
model.add(Dense(1))# 单步预测,1个神经元
#-----------------------------------------------
#-----------------------------------------------
from keras.optimizers import  Adam
from keras.losses import mae
model.compile(optimizer=Adam(0.01),loss='mae')
#-----------------------------------------------
#-----------------------------------------------
# 动态调整学习率与提前终止函数
def scheduler(epoch):
    # 每隔10个epoch,学习率减小为原来的1/10
    if epoch % 10 == 0 and epoch != 0:
        lr = K.get_value(model.optimizer.lr)
        if lr>1e-5:
            K.set_value(model.optimizer.lr, lr * 0.1)
            print("lr changed to {}".format(lr * 0.1))
    return K.get_value(model.optimizer.lr)

reduce_lr = LearningRateScheduler(scheduler)

 五,模型训练

model.fit(x=seq_test_x_1[:400],y=seq_test_y[:400],batch_size=2,epochs=40,verbose=2,callbacks=[reduce_lr])
#这里的400依据数据长度进行修改,比如500个长度,前400个拿来训练,后100个拿来测试,lstm一般不需要validate验证,

六,预测与评估

import matplotlib.pyplot as plt
yre=yre.reshape(yre.shape[0])
plt.figure(dpi=300,figsize=(20,1))
plt.plot(yre,'b-',seq_test_y[400:],'r-')
#这里的400依据数据长度进行修改,比如500个长度,前400个拿来训练,后100个拿来测试,lstm一般不需要validate验证,如果需要预测500之后的,利用450-500的数据生成滑动窗口,生成500之后的数据,再利用生成的数据生成新的滑动窗口进行预测

七,结果展示

        一些其他结论,比如r2_score可以添加。

from sklearn.metrics import r2_score
print(r2_score(seq_test_y[400:],yre))

猜你喜欢

转载自blog.csdn.net/weixin_44992737/article/details/127948872