国际旅行人数预测——使用多层感知器

这个例子是使用多层感知器来处理时间序列问题,例子来源于魏贞原老师的书。

数据集使用的是国际旅行旅客人数数据集(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有了一定的提升,不过仍属于较低的范围。

猜你喜欢

转载自blog.csdn.net/sun___M/article/details/83750578