Benützer:


Langes Kurzzeitgedächtnis (LSTMs)

Storyboard

Das Fahrgastzahlenmodell nimmt historische Segmente und die darauf folgenden Werte und versucht, das Muster zu erkennen und nach einer beliebigen Sequenz daraus abzuleiten, wie es weitergeht.

Code und Daten

paxs_rnn.ipynb

international-airline-passengers.csv

>Modell

ID:(1793, 0)



Bibliotheken importieren

Beschreibung

>Top


Importieren der erforderlichen Bibliotheken:

import numpy
import pandas as pd 
import matplotlib.pyplot as plt
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error

ID:(13885, 0)



Historische Daten laden

Beschreibung

>Top


Laden Sie die Daten aus den international-airline-passengers.csv Daten:

# load data
data = pd.read_csv('international-airline-passengers.csv',skipfooter=5)
data.head()


ID:(13886, 0)



Historische Daten anzeigen

Beschreibung

>Top


Daten anzeigen:

# show data
dataset = data.iloc[:,1].values
plt.plot(dataset)
plt.xlabel('time')
plt.ylabel('Number of Passenger')
plt.title('international airline passenger')
plt.show()


ID:(13887, 0)



Daten umformen und auflisten

Beschreibung

>Top


Daten umformen und auflisten:

# reshape and list data
dataset = dataset.reshape(-1,1)
dataset = dataset.astype('float32')
print(dataset)

[[112.]

[118.]

[132.]

[129.]

...

[606.]

[508.]

[461.]]

ID:(13888, 0)



Werte neu skalieren

Beschreibung

>Top


Um die Lernqualität zu verbessern, werden die Werte zwischen 0 und 1 neu skaliert:

# scaling 
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
print(dataset)

[[0.01544401]

[0.02702703]

[0.05405405]

...

[0.96911204]

[0.7799227 ]

[0.6891892 ]]

ID:(13889, 0)



Generieren der Trainings- und Bewertungsdaten

Beschreibung

>Top


El arreglo inicial es segmentado en un grupo de registros para entrenar y un segundo para testear el modelo generado:

# generate train and test data 
train_size = int(len(dataset) * 0.50)
test_size = len(dataset) - train_size
train = dataset[0:train_size,:]
test = dataset[train_size:len(dataset),:]
print('train size: {}, test size: {} '.format(len(train), len(test)))
print(train)

train size: 71, test size: 71

[[0.01544401]

[0.02702703]

[0.05405405]

...

[0.2992278 ]

[0.24131274]

[0.1911197 ]]

ID:(13890, 0)



Trainingssegmente erstellen

Beschreibung

>Top


Die Folgen X_train und der darauf folgende Wert y_train werden gebildet:

# creating a data structure with 10 timesteps and 1 output
time_stemp = 10
dataX = []
dataY = []
for i in range(len(train)-time_stemp-1):
    a = train[i:(i+time_stemp), 0]
    dataX.append(a)
    dataY.append(train[i + time_stemp, 0])
trainX = numpy.array(dataX)
trainY = numpy.array(dataY)
print('trainX:',trainX.shape[0],',',trainX.shape[1],' trainY:',trainY.shape[0])
print('trainX=',trainX)
print('trainY=',trainY)

trainX: 60 , 10 trainY: 60

trainX= [[0.01544401 0.02702703 0.05405405 0.04826255 0.03281853 0.05984557

0.08494207 0.08494207 0.06177607 0.02895753]

...

[0.18725869 0.19305018 0.16216215 0.25289574 0.23745173 0.25096524

0.3088803 0.38223937 0.36486486 0.2992278 ]]

trainY= [0. 0.02702703 0.02123553 0.04247104 0.07142857 0.05984557

...

0.25096524 0.3088803 0.38223937 0.36486486 0.2992278 0.24131274]

ID:(13891, 0)



Bewertungssegmente erstellen

Beschreibung

>Top


Die Folgen X_train und der darauf folgende Wert y_train werden gebildet:

# creating a data structure with 10 timesteps and 1 output
dataX = []
dataY = []
for i in range(len(test)-time_stemp-1):
    a = test[i:(i+time_stemp), 0]
    dataX.append(a)
    dataY.append(test[i + time_stemp, 0])
testX = numpy.array(dataX)
testY = numpy.array(dataY)
print('testX:',testX.shape[0],',',testX.shape[1],' testY:',testY.shape[0])
print('testX=',testX)
print('testY=',testY)

testX: 60 , 10 testY: 60

testX= [[0.24131274 0.26640925 0.24903473 0.31467178 0.3185328 0.32046333

0.4073359 0.5019305 0.46911195 0.40154442]

...

[0.4980695 0.58108103 0.6042471 0.554054 0.60810804 0.6891892

0.71042466 0.8320464 1. 0.96911204]]

testY= [0.32818535 0.25675675 0.3359073 0.34749034 0.33397684 0.41119692

...

0.6891892 0.71042466 0.8320464 1. 0.96911204 0.7799227 ]

ID:(13892, 0)



Die Tensoren formen

Beschreibung

>Top


Zum Trainieren müssen Sie die Tensoren trainX und testX bilden:

trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
print('trainX=',trainX)
print('testX=',testX)

trainX= [[[0.01544401 0.02702703 0.05405405 0.04826255 0.03281853 0.05984557

0.08494207 0.08494207 0.06177607 0.02895753]]

...

[[0.18725869 0.19305018 0.16216215 0.25289574 0.23745173 0.25096524

0.3088803 0.38223937 0.36486486 0.2992278 ]]]

testX= [[[0.24131274 0.26640925 0.24903473 0.31467178 0.3185328 0.32046333

0.4073359 0.5019305 0.46911195 0.40154442]]

...

[[0.4980695 0.58108103 0.6042471 0.554054 0.60810804 0.6891892

0.71042466 0.8320464 1. 0.96911204]]]

ID:(13893, 0)



Definieren, erstellen und trainieren des Modells

Beschreibung

>Top


Definieren, erstellen und trainieren des Modells:

# model
paxs_model = Sequential()
paxs_model.add(LSTM(10, input_shape=(1, time_stemp))) # 10 lstm neuron(block)
paxs_model.add(Dense(1))
paxs_model.compile(loss='mean_squared_error', optimizer='adam')
paxs_model.fit(trainX, trainY, epochs=50, batch_size=1)

Epoch 1/50

60/60 [==============================] - 9s 759us/step - loss: 0.0249

Epoch 2/50

60/60 [==============================] - 0s 710us/step - loss: 0.0041

Epoch 3/50

60/60 [==============================] - 0s 710us/step - loss: 0.0026

...

Epoch 48/50

60/60 [==============================] - 0s 727us/step - loss: 8.7224e-04

Epoch 49/50

60/60 [==============================] - 0s 733us/step - loss: 0.0010

Epoch 50/50

60/60 [==============================] - 0s 724us/step - loss: 0.0012

ID:(13894, 0)



Prognose de Passagierzahl

Beschreibung

>Top


Vorhersage von Trainingsdaten trainPredict und Testdaten testPredict :

trainPredict = paxs_model.predict(trainX)
testPredict = paxs_model.predict(testX)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
# calculate root mean squared error
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))

ID:(13895, 0)



Vergleichen Sie vorhergesagte Werte mit tatsächlichen Werten

Beschreibung

>Top


Abschließend werden die prognostizierten und tatsächlichen Werte angezeigt:

# shifting train
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[time_stemp:len(trainPredict)+time_stemp, :] = trainPredict
# shifting test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(time_stemp*2)+1:len(dataset)-1, :] = testPredict
# plot baseline and predictions
plt.plot(scaler.inverse_transform(dataset), label='real')
plt.plot(trainPredictPlot, label='training')
plt.plot(testPredictPlot, label='forecast')
plt.xlabel('time')
plt.ylabel('Number of Passenger')
plt.title('international airline passenger')
plt.legend(loc='lower right')
plt.show()


ID:(13896, 0)