Keras - Previsão de série temporal usando LSTM RNN

Neste capítulo, vamos escrever um RNN simples baseado em Long Short Term Memory (LSTM) para fazer análise de sequência. Uma sequência é um conjunto de valores em que cada valor corresponde a uma instância particular de tempo. Vamos considerar um exemplo simples de leitura de uma frase. Ler e entender uma frase envolve ler a palavra na ordem dada e tentar entender cada palavra e seu significado no contexto dado e, finalmente, entender a frase em um sentimento positivo ou negativo.

Aqui, as palavras são consideradas como valores, e o primeiro valor corresponde à primeira palavra, o segundo valor corresponde à segunda palavra, etc., e a ordem será estritamente mantida. Sequence Analysis é usado com frequência no processamento de linguagem natural para encontrar a análise de sentimento do texto fornecido.

Vamos criar um modelo LSTM para analisar as resenhas de filmes IMDB e encontrar seu sentimento positivo / negativo.

O modelo para a análise da sequência pode ser representado como abaixo -

As principais características do modelo são as seguintes -

  • Camada de entrada usando a camada Embedding com 128 recursos.

  • A primeira camada, Densa, consiste em 128 unidades com dropout normal e dropout recorrente definido para 0,2.

  • Camada de saída, Densa consiste em 1 unidade e função de ativação 'sigmóide'.

  • Usar binary_crossentropy como função de perda.

  • Usar adam como otimizador.

  • Usar accuracy como métricas.

  • Use 32 como tamanho do lote.

  • Use 15 como épocas.

  • Use 80 como o comprimento máximo da palavra.

  • Use 2000 como o número máximo de palavras em uma determinada frase.

Etapa 1: importar os módulos

Deixe-nos importar os módulos necessários.

from keras.preprocessing import sequence 
from keras.models import Sequential 
from keras.layers import Dense, Embedding 
from keras.layers import LSTM 
from keras.datasets import imdb

Etapa 2: Carregar dados

Vamos importar o conjunto de dados imdb.

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words = 2000)

Aqui,

  • imdbé um conjunto de dados fornecido por Keras. Ele representa uma coleção de filmes e suas críticas.

  • num_words representam o número máximo de palavras na revisão.

Etapa 3: processar os dados

Vamos alterar o conjunto de dados de acordo com nosso modelo, para que possa ser alimentado em nosso modelo. Os dados podem ser alterados usando o código abaixo -

x_train = sequence.pad_sequences(x_train, maxlen=80) 
x_test = sequence.pad_sequences(x_test, maxlen=80)

Aqui,

sequence.pad_sequences converter a lista de dados de entrada com forma, (data) em matriz NumPy 2D de forma (data, timesteps). Basicamente, ele adiciona o conceito de passos de tempo aos dados fornecidos. Ele gera os passos de tempo de duração,maxlen.

Etapa 4: crie o modelo

Vamos criar o modelo real.

model = Sequential() 
model.add(Embedding(2000, 128)) 
model.add(LSTM(128, dropout = 0.2, recurrent_dropout = 0.2)) 
model.add(Dense(1, activation = 'sigmoid'))

Aqui,

Nós usamos Embedding layercomo camada de entrada e depois adicionada a camada LSTM. Finalmente, umDense layer é usado como camada de saída.

Etapa 5: compilar o modelo

Vamos compilar o modelo usando a função de perda, otimizador e métricas selecionadas.

model.compile(loss = 'binary_crossentropy', 
   optimizer = 'adam', metrics = ['accuracy'])

Etapa 6: treinar o modelo

Vamos treinar o modelo usando fit() método.

model.fit(
   x_train, y_train, 
   batch_size = 32, 
   epochs = 15, 
   validation_data = (x_test, y_test)
)

Executar o aplicativo irá gerar as informações abaixo -

Epoch 1/15 2019-09-24 01:19:01.151247: I 
tensorflow/core/platform/cpu_feature_guard.cc:142] 
Your CPU supports instructions that this 
TensorFlow binary was not co mpiled to use: AVX2 
25000/25000 [==============================] - 101s 4ms/step - loss: 0.4707 
- acc: 0.7716 - val_loss: 0.3769 - val_acc: 0.8349 Epoch 2/15 
25000/25000 [==============================] - 95s 4ms/step - loss: 0.3058 
- acc: 0.8756 - val_loss: 0.3763 - val_acc: 0.8350 Epoch 3/15 
25000/25000 [==============================] - 91s 4ms/step - loss: 0.2100 
- acc: 0.9178 - val_loss: 0.5065 - val_acc: 0.8110 Epoch 4/15 
25000/25000 [==============================] - 90s 4ms/step - loss: 0.1394 
- acc: 0.9495 - val_loss: 0.6046 - val_acc: 0.8146 Epoch 5/15 
25000/25000 [==============================] - 90s 4ms/step - loss: 0.0973 
- acc: 0.9652 - val_loss: 0.5969 - val_acc: 0.8147 Epoch 6/15 
25000/25000 [==============================] - 98s 4ms/step - loss: 0.0759 
- acc: 0.9730 - val_loss: 0.6368 - val_acc: 0.8208 Epoch 7/15 
25000/25000 [==============================] - 95s 4ms/step - loss: 0.0578 
- acc: 0.9811 - val_loss: 0.6657 - val_acc: 0.8184 Epoch 8/15 
25000/25000 [==============================] - 97s 4ms/step - loss: 0.0448 
- acc: 0.9850 - val_loss: 0.7452 - val_acc: 0.8136 Epoch 9/15 
25000/25000 [==============================] - 95s 4ms/step - loss: 0.0324 
- acc: 0.9894 - val_loss: 0.7616 - val_acc: 0.8162Epoch 10/15 
25000/25000 [==============================] - 100s 4ms/step - loss: 0.0247 
- acc: 0.9922 - val_loss: 0.9654 - val_acc: 0.8148 Epoch 11/15 
25000/25000 [==============================] - 99s 4ms/step - loss: 0.0169 
- acc: 0.9946 - val_loss: 1.0013 - val_acc: 0.8104 Epoch 12/15 
25000/25000 [==============================] - 90s 4ms/step - loss: 0.0154 
- acc: 0.9948 - val_loss: 1.0316 - val_acc: 0.8100 Epoch 13/15 
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0113 
- acc: 0.9963 - val_loss: 1.1138 - val_acc: 0.8108 Epoch 14/15 
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0106 
- acc: 0.9971 - val_loss: 1.0538 - val_acc: 0.8102 Epoch 15/15 
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0090 
- acc: 0.9972 - val_loss: 1.1453 - val_acc: 0.8129 
25000/25000 [==============================] - 10s 390us/step

Etapa 7 - Avalie o modelo

Vamos avaliar o modelo usando dados de teste.

score, acc = model.evaluate(x_test, y_test, batch_size = 32) 
   
print('Test score:', score) 
print('Test accuracy:', acc)

Executar o código acima resultará nas informações abaixo -

Test score: 1.145306069601178 
Test accuracy: 0.81292