keras函数评估不能正确计算mape

时间:2018-07-21 13:56:56

标签: python keras lstm

我是新手,正在创建一个具有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()

0 个答案:

没有答案