國際旅行人數預測——使用多層感知器
阿新 • • 發佈:2018-11-27
這個例子是使用多層感知器來處理時間序列問題,例子來源於魏貞原老師的書。
資料集使用的是國際旅行旅客人數資料集(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有了一定的提升,不過仍屬於較低的範圍。