这是一组航班的乘客数据,是一维的数据,这里列出了一部分数据。使用kares框架来搭建LSTM模型进行预测下个月的数据。
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
import pandas as pd
import os
from keras.models import Sequential, load_model
from sklearn.preprocessing import MinMaxScaler
import csv
#读取文件
def dataload(filename):
X =[]
with open(filename) as f:
reader=csv.reader(f)
header_row = next(reader)
for line in reader:
X.append(line[1:2])
return X
filename = 'airline-passengers.csv'
X = dataload(filename)
#中心化处理。将数据压缩到0到1之间
scaler = MinMaxScaler(feature_range=(0,1))
X = scaler.fit_transform(X)
#将数据集的前70%作为训练集,后30%作为测试集
trian_x = X[:int(len(X) * 0.7)]
test_x = X[int(len(X) * 0.7):]
def load_data(dataset, stemp):
X_train, Y_train = [],[]
for i in range(len(dataset) - stemp - 1):
temp = dataset[i:(i + stemp)]
X_train.append(temp)
Y_train.append(dataset[i+stemp])
return np.array(X_train), np.array(Y_train)
stemp = 1
trainX, trainY = load_data(trian_x, stemp)
testX, testY = load_data(test_x, stemp)
model = Sequential()
model.add(LSTM(4, input_shape = (None, 1)))#LSTM的输入为 [samples, timesteps, features]
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
trainpre = model.predict(trainX)
testpre = model.predict(testX)
newtest = testX[41:42]
next = model.predict(newtest)
trainpre = scaler.inverse_transform(trainpre)
trainY = scaler.inverse_transform(trainY)
testpre = scaler.inverse_transform(testpre)
testY = scaler.inverse_transform(testY)
print('下一个月的预测数据是:' + str(scaler.inverse_transform(next)[0][0]))
plt.plot(trainY)
plt.plot(trainpre[1:])
plt.show()
plt.plot(testY)
plt.plot(testpre[1:])
plt.show()