我是新手,正在创建一个具有MAPE错误的LSTM。虽然,通过检查结果值,我发现手动计算时,评估函数给出的错误(99.998%)不相同(14%)。所以我有两个问题:
1-评估函数给我的是MAPE错误还是给我其他东西? 2-是MAPE错误还是此“其他”信息用于训练模型?
提前谢谢,早上/下午/晚上好。
代码:
#Importa bibliotecas
from keras.layers.core import Dense
from keras.layers.recurrent import LSTM
from keras.models import Sequential
import matplotlib.pyplot as plt
import math
# In[29]:
#Importa funções auxiliares
from helper_serie_temporal import *
# In[38]:
#Importa e normaliza dados, retorna dados normalizados e
#fator de escalonamento (scaler)
serie,scaler = pre_process_data()
# In[48]:
#Plota dados de entrada do modelo normalizados
NUM_ENTRIES = 264
plt.plot(range(NUM_ENTRIES), serie[0:NUM_ENTRIES])
plt.ylabel("ICMS")
plt.xlabel("mês")
plt.show()
# In[61]:
#Separa e janela (?) dados
NUM_TIMESTEPS=12#=janela?
BATCH_SIZE = 12#= (pode identificar) periodicidade = You also need to ensure that training and test data sizes are perfect multiples of your batch size
# Em cada batch, o modelo pegara uma sequencia de 12 meses e prevê os 12 meses seguintes. A dimensão da sequencia de entrada é dada pela variavel `NUM_TIMESTEPS` no código. Observando os dados, o valor para `NUM_TIMESTEPS` de 12 parece ser apropriado. Então, cada fila tem uma sequencia de dimensão 12 e a saida de dimensão 1. O seguinte passo reordena as matrizes $x$ e $y$ em tensor de entrada de dimensão `(None,4)` e `(None,1)`. Finalmente, redimensionamos o tensor de entrada $x$ para 3 dimensões para a entrada de nossa rede.
# Finalmente, dividimos nossos dados de treinamento e teste (70-30). Como trabalhamos com series temporais, escolhemos o ponto de corte e dividimos a data em 2 partes, e não usamos a função `train_test_split`, que embaralha os dados.
Xtrain, Xtest, Ytrain, Ytest = get_serie_train_test(serie = serie,
num_timesteps = NUM_TIMESTEPS,
batch_size = BATCH_SIZE,
per_train = 0.7)
# In[77]:
#Cria modelos
HIDDEN_SIZE = 120#Our LSTM output size is given by hidden_size(???tá no livro), another hyperparameter that is usually arrived at through experimentation.
NUM_EPOCHS = 5
# stateful=True : A razão de se manter os estados de um passo para outro é devido à
#sazonalidade, isso é, a dependência periodica que os dados apresentam.
model = Sequential()
model.add(LSTM(HIDDEN_SIZE, stateful=True,
batch_input_shape=(BATCH_SIZE, NUM_TIMESTEPS, 1),
return_sequences=False))
model.add(Dense(1))
model.compile(loss='MAPE', optimizer='adam',
metrics=['MAPE'])
model.summary()
# In[98]:
#Treinamento
print(Xtrain.shape, Xtest.shape, Ytrain.shape, Ytest.shape)
for i in range(NUM_EPOCHS):
#print("Epoch {:d}/{:d}".format(i+1, NUM_EPOCHS))
model.fit(Xtrain, Ytrain, batch_size=BATCH_SIZE, epochs=1, verbose=0,
validation_data=(Xtest, Ytest),
shuffle=False)
model.reset_states()
# In[115]:
#Previsão
output = model.predict(Xtest, batch_size=BATCH_SIZE)
#desnormaliza dados
output = scaler.inverse_transform(output)
Ytest = scaler.inverse_transform(Ytest)
Xtest[:,:,0]=scaler.inverse_transform(Xtest[:,:,0])
# In[128]:
#Plota resultado dos erros
score, _ = model.evaluate(Xtest, Ytest, batch_size=BATCH_SIZE, verbose=0)
print("\nMAPE: {:.3f}".format(score))
# In[128]:
#Plota resultado previsão x teste
steps = range(NUM_ENTRIES)
plt.figure(num=None, figsize=(15, 6), dpi=80, facecolor='w', edgecolor='k')
plt.plot(steps[0:len(output)],output[-NUM_ENTRIES:],'r--',
steps[0:len(output)],Ytest[-NUM_ENTRIES:], 'b' )
#steps[0:len(output)],Xtest_inv, 'm' )
plt.show()