1. 程式人生 > >國際旅行人數預測——使用多層感知器

國際旅行人數預測——使用多層感知器

這個例子是使用多層感知器來處理時間序列問題,例子來源於魏貞原老師的書。

資料集使用的是國際旅行旅客人數資料集(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有了一定的提升,不過仍屬於較低的範圍。