这个例子是使用多层感知器来处理时间序列问题,例子来源于魏贞原老师的书。
数据集使用的是国际旅行旅客人数数据集(international-airline-passengers)
数据集下载:国际旅行旅客人数数据集(international-airline-passengers)
利用matplotlib,我们先看一下实际数据的变化趋势。
之后构建一个仅有一个隐藏层的多层感知器模型,并将数据集分为训练数据集和评估数据集。在此基础上进行预测。
代码如下:
"""
多层感知器的时间序列预测:国际旅行人数预测
"""
from pandas import read_csv
from matplotlib import pyplot as plt
import math
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
seed = 7
batch_size = 2
epochs = 200
look_back = 1
def create_dataset(dataset):
dataX, dataY = [],[]
for i in range(len(dataset)-look_back-1):
x = dataset[i: i+look_back,0]
dataX.append(x)
y = dataset[i+look_back,0]
dataY.append(y)
print('X : %s, Y : %s' % (x, y))
return np.array(dataX), np.array(dataY)
def build_model():
model = Sequential()
model.add(Dense(units=8, input_dim=look_back, activation='relu'))
model.add(Dense(units=1))
model.compile(loss='mean_squared_error', optimizer='adam')
return model
if __name__ == '__main__':
#设置随机种子
np.random.seed(seed)
#导入数据
filename = 'F:/Python/pycharm/keras_deeplearning/datasets/international-airline-passengers.csv'
footer = 1
# 导入数据
data = read_csv(filename, usecols=[1], engine='python', skipfooter=footer, skiprows=0)
# 图表展示
plt.plot(data)
plt.show()
dataset = data.values.astype('float32')
train_size = int(len(dataset) * 0.67)
validation_size = len(dataset) - train_size
train, validation = dataset[0: train_size, :], dataset[train_size:len(dataset), :]
#创建dataset,让数据产生相关性
X_train, y_train = create_dataset(train)
X_validation, y_validation = create_dataset(validation)
#训练模型
model = build_model()
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=2)
#评估模型
train_score = model.evaluate(X_train, y_train, verbose=0)
print('Train score: %.2f MSE (%.2f RMSE)' % (train_score, math.sqrt(train_score)))
validation_score = model.evaluate(X_validation, y_validation, verbose=0)
print('Train score: %.2f MSE (%.2f RMSE)' % (validation_score, math.sqrt(validation_score)))
#利用图表查看预测趋势
predict_train = model.predict(X_train)
predict_validation = model.predict(X_validation)
#构建通过训练数据集进行预测的图表数据
predict_train_plot = np.empty_like(dataset)
predict_train_plot[:, :] = np.nan
predict_train_plot[look_back:len(predict_train)+look_back,:] = predict_train
#构建通过评估数据集进行预测的图表数据
predict_validation_plot = np.empty_like(dataset)
predict_validation_plot[:, :] = np.nan
predict_validation_plot[len(predict_train)+look_back * 2 + 1: len(dataset)-1, :] = predict_validation
#图标显示
plt.plot(dataset, color='black')
plt.plot(predict_train_plot, color='green')
plt.plot(predict_validation_plot, color='red')
plt.show()
结果为:
Train score: 531.71 MSE (23.06 RMSE)
Train score: 2355.06 MSE (48.53 RMSE)
书中还举有一个例子,采用使用窗口方法的多层感知器——即将look_back参数设置为3,便可将输入变量变为时刻(t-2)、(t-1)、(t),输出变量仍未(t+1)。
并且在构建模型时,多了一个隐藏层。这样使得结果的Accuracy有了一定的提升,不过仍属于较低的范围。