Pode ser difícil preparar dados quando você está apenas começando com o aprendizado profundo.
Long Short-Term Memory, ou LSTM, redes neurais recorrentes esperam entrada tridimensional na biblioteca de aprendizado profundo Keras Python.
Se você tiver uma longa sequência de milhares de observações em seus dados de série temporal, deverá dividir sua série temporal em amostras e, em seguida, reformulá-la para seu modelo LSTM.
Neste tutorial, você descobrirá exatamente como preparar seus dados de série temporal univariados para um modelo LSTM em Python com Keras.
Comece seu projeto com meu novo livro Deep Learning for Time Series Forecasting, incluindo tutoriais passo a passo e a Código-fonte Python arquivos para todos os exemplos.
Vamos começar.

Como preparar dados de série temporal univariada para redes de memória de longo prazo
Foto de Miguel Mendez, alguns direitos reservados.
Como preparar dados de série temporal
Talvez a pergunta mais comum que recebo seja como preparar dados de séries temporais para o aprendizado supervisionado.
Eu escrevi algumas postagens sobre o assunto, como:
Mas essas postagens não ajudam a todos.
Recentemente recebi este e-mail:
Eu tenho duas colunas em meu arquivo de dados com 5000 linhas, a coluna 1 é o tempo (com intervalo de 1 hora) e a coluna 2 é bits / seg. E estou tentando prever bits / seg. Nesse caso, você pode me ajudar a definir a amostra, intervalo de tempo e recurso [for LSTMs]?
Existem alguns problemas aqui:
- Os LSTMs esperam entrada 3D e pode ser um desafio entender isso pela primeira vez.
- Os LSTMs não gostam de sequências de mais de 200-400 intervalos de tempo, portanto, os dados precisarão ser divididos em amostras.
Neste tutorial, usaremos essa pergunta como base para mostrar uma maneira de preparar dados especificamente para a rede LSTM em Keras.
Precisa de ajuda com Deep Learning for Time Series?
Faça meu curso intensivo de e-mail gratuito de 7 dias agora (com código de exemplo).
Clique para se inscrever e também obter uma versão gratuita do Ebook em PDF do curso.
Baixe o seu mini-curso GRÁTIS
1. Carregue os dados
Presumo que você saiba carregar os dados como uma série Pandas ou DataFrame.
Se não, veja estas postagens:
Aqui, simularemos o carregamento definindo um novo conjunto de dados na memória com 5.000 etapas de tempo.
a partir de entorpecido importar variedade
# carregar... dados = Lista() n = 5000 pra eu no faixa(n): dados.acrescentar([i+1, (i+1)*10]) dados = variedade(dados) imprimir(dados[:5, :]) imprimir(dados.forma) |
Executar esta parte imprime as primeiras 5 linhas de dados e a forma dos dados carregados.
Podemos ver que temos 5.000 linhas e 2 colunas: um conjunto de dados de série temporal univariada padrão.
[[ 1 10] [ 2 20] [ 3 30] [ 4 40] [ 5 50]] (5000, 2) |
2. Tempo de queda
Se seus dados de série temporal forem uniformes ao longo do tempo e não houver valores ausentes, podemos descartar a coluna de tempo.
Caso contrário, você pode querer considerar a imputação dos valores ausentes, reamostrar os dados para uma nova escala de tempo ou desenvolver um modelo que possa lidar com os valores ausentes. Veja postagens como:
Aqui, deixamos cair a primeira coluna:
# tempo de entrega dados = dados[:, 1] imprimir(dados.forma) |
Agora temos uma matriz de 5.000 valores.
3. Dividir em amostras
Os LSTMs precisam processar amostras onde cada amostra é uma única série temporal.
Nesse caso, 5.000 intervalos de tempo são muito longos; Os LSTMs funcionam melhor com intervalos de tempo de 200 a 400 com base em alguns artigos que li. Portanto, precisamos dividir as 5.000 etapas de tempo em várias subseqüências mais curtas.
Escrevo mais sobre a divisão de longas sequências aqui:
Existem muitas maneiras de fazer isso e você pode querer explorar algumas, dependendo do seu problema.
Por exemplo, talvez você precise de sequências sobrepostas, talvez a não sobreposição seja boa, mas seu modelo precisa de estado entre as subseqüências e assim por diante.
Aqui, dividiremos as 5.000 etapas de tempo em 25 subseqüências de 200 etapas de tempo cada. Em vez de usar truques de NumPy ou Python, faremos isso da maneira antiga para que você possa ver o que está acontecendo.
# dividir em amostras (por exemplo, 5000/200 = 25) amostras = Lista() comprimento = 200 # ultrapassar os 5.000 em saltos de 200 pra eu no faixa(0,n,comprimento): # pegar de i para i + 200 amostra = dados[i:i+length] amostras.acrescentar(amostra) imprimir(len(amostras)) |
Agora temos 25 subseqüências de 200 etapas de tempo cada.
Se você preferir fazer isso em uma linha, vá em frente. Eu adoraria ver o que você pode fazer.
Poste sua abordagem nos comentários abaixo.
4. Remodele as subseqüências
O LSTM precisa de dados com o formato de [samples, time steps and features].
Aqui, temos 25 amostras, 200 etapas de tempo por amostra e 1 recurso.
Primeiro, precisamos converter nossa lista de matrizes em uma matriz NumPy 2D de 25 x 200.
# converter lista de arrays em array 2d dados = variedade(amostras) imprimir(dados.forma) |
Executando esta peça, você verá:
Em seguida, podemos usar o remodelar () função para adicionar uma dimensão adicional para nosso único recurso.
# remodelar em [samples, timesteps, features] # Espero [25, 200, 1] dados = dados.remodelar((len(amostras), comprimento, 1)) imprimir(dados.forma) |
E é isso.
Os dados agora podem ser usados como uma entrada (X) para um modelo LSTM.
Leitura Adicional
Esta seção fornece mais recursos sobre o tópico se você deseja se aprofundar.
Postagens Relacionadas
API
Resumo
Neste tutorial, você descobriu como converter seus dados de série temporal univariados longos em um formato que pode ser usado para treinar um modelo LSTM em Python.
Esta postagem ajudou? Você tem alguma pergunta?
Deixe-me saber nos comentários abaixo.