本文使用耶拿天氣數(shù)據(jù)集,對溫度進(jìn)行預(yù)測。由于數(shù)據(jù)量過大,筆者只使用前100天的溫度數(shù)據(jù)作為訓(xùn)練即共14400個(gè)溫度數(shù)據(jù),預(yù)測后10天的溫度即共1440個(gè)溫度數(shù)據(jù)。主要思想與LSTM進(jìn)行時(shí)間序列預(yù)測(一)相同,便不做過多分析,完整代碼如下:
import csv
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
def temp_dataset():
with open('jena_climate_2009_2016.csv',encoding = 'utf-8-sig') as f:
reader = csv.reader(f)
dataset = []
for item in reader:
try:
dataset.append(float(item[2]))
except:
pass
return np.array(dataset).reshape(-1,1)
def sc_fit_transform(nDlist):
#將所有數(shù)據(jù)歸一化為0-1的范圍
sc = MinMaxScaler(feature_range=(0, 1))
dataset_transform = sc.fit_transform(X=nDlist)
#歸一化后的數(shù)據(jù)
return sc, np.array(dataset_transform)
###############################################################################
#需要之前144次的數(shù)據(jù)來預(yù)測下一次的數(shù)據(jù),
timestep = 144
#訓(xùn)練數(shù)據(jù)的大小
training_num = 14400
#迭代訓(xùn)練10次
epoch = 10
#每次取數(shù)據(jù)數(shù)量
batch_size = 200
###############################################################################
listDataset = temp_dataset()
# print(listDataset.shape)
# 生成訓(xùn)練集
xTrainDataset = listDataset[0:training_num]
print(xTrainDataset.shape)
yTrainDataset = listDataset[1:training_num+1]
print(yTrainDataset.shape)
#原始數(shù)據(jù)歸一化
scTrainDataseX, xTrainDataset = sc_fit_transform(xTrainDataset)
scTrainDataseY, yTrainDataset = sc_fit_transform(yTrainDataset)
###############################################################################
# 生成lstm模型需要的訓(xùn)練集數(shù)據(jù)
xTrain = []
for i in range(timestep, training_num):
xTrain.append(xTrainDataset[i-timestep : i])
xTrain = np.array(xTrain)
print(xTrain.shape)
yTrain = []
for i in range(timestep, training_num):
yTrain.append(yTrainDataset[i])
yTrain = np.array(yTrain)
print(yTrain.shape)
###############################################################################
# 構(gòu)建網(wǎng)絡(luò),使用的是序貫?zāi)P?model = Sequential()
model.add(LSTM(units=128, input_shape=[xTrain.shape[1], 1]))
model.add(Dense(1))
#進(jìn)行配置
model.compile(optimizer='adam',
loss='mean_squared_error',
metrics=['accuracy'])
model.fit(x=xTrain, y=yTrain, epochs=epoch, batch_size=batch_size)
###############################################################################
#進(jìn)行測試數(shù)據(jù)的處理
xTestDataset = listDataset[training_num : 15840-2]
scTesDatasetX, xTestDataset = sc_fit_transform(xTestDataset)
yTestDataset = listDataset[training_num+1 : 15840-1]
scTestDataseY, yTestDataset = sc_fit_transform(yTestDataset)
# 生成lstm模型需要的訓(xùn)練集數(shù)據(jù)
xTest = []
for i in range(timestep, len(xTestDataset)):
xTest.append(xTestDataset[i-timestep : i])
xTest = np.array(xTest)
# print(xTest.shape)
yTest = []
for i in range(timestep, len(xTestDataset)):
yTest.append(yTestDataset[i])
# 反歸一化
yTest = scTestDataseY.inverse_transform(X= yTest)
# print(yTest.shape)
###############################################################################
#進(jìn)行預(yù)測
yPredictes = model.predict(x=xTest)
# 反歸一化
yPredictes = scTestDataseY.inverse_transform(X=yPredictes)
###############################################################################
#對比結(jié)果,繪制數(shù)據(jù)圖表,紅色是真實(shí)數(shù)據(jù),藍(lán)色是預(yù)測數(shù)據(jù)
plt.plot(yTest, color='red', label='Real')
plt.plot(yPredictes, color='blue', label='Predict')
plt.title(label='Prediction')
plt.xlabel(xlabel='Time')
plt.ylabel(ylabel='T')
plt.legend()
plt.show()
# 評估標(biāo)準(zhǔn): mae, rmse, r2_score
mae = mean_absolute_error(yTest, yPredictes)
rmse = mean_squared_error(yTest, yPredictes, squared=False)
r2 = r2_score(yTest, yPredictes)
print(mae, rmse, r2)
# 0.5398017517750193 0.7921849560734467 0.9763136585185972
測試集和預(yù)測數(shù)據(jù)折線圖:

mae:0.5583895525423784
rmse:0.8061969889732786
r2:0.9742544305395516