Path: blob/master/site/pt-br/tutorials/structured_data/time_series.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Previsão de séries temporais
Este tutorial é uma introdução à previsão de séries temporais usando o TensorFlow. São criados alguns estilos de modelos diferentes, incluindo Redes Neurais Convolucionais e Recorrentes (CNN e RNN, nas siglas em inglês).
O tutorial é composto por duas partes principais com subseções:
Previsão com um passo temporal:
Uma única característica.
Todas as características.
Vários passos de previsão:
Single-shot (etapa única): faça todas as previsões de uma vez.
Autorregressivo: faça uma previsão de cada vez e alimente a saída de volta no modelo.
Configuração
Dataset do clima
Este tutorial usa um dataset de série temporal do clima registrado pelo Max Planck Institute for Biogeochemistry.
Este dataset contém 14 características diferentes, como temperatura do ar, pressão atmosférica e umidade, que foram coletadas a cada 10 minutos a partir de 2003. Por questões de eficiência, usaremos somente os dados coletados entre 2009 e 2016. Esse segmento do dataset foi preparado por François Chollet para seu livro Deep Learning with Python (Aprendizado profundo com o Python).
Este tutorial tratará somente as previsões por hora, então comece fazendo a subamostragem dos dados, transformando os intervalos de 10 minutos em intervalos de uma hora:
Vamos dar uma olhada nos dados. Veja as primeiras linhas:
Confira a evolução de algumas características ao longo do tempo:
Inspeção e limpeza
Agora, veja as estatísticas do dataset:
Velocidade do vento
Um aspecto que deve se destacar são as colunas de valor mínimo min
(wv (m/s)
) e valor máximo (max. wv (m/s)
) da velocidade do vento. Provavelmente, o valor -9999
é um erro.
Temos uma coluna separada para direção do vento, então a velocidade precisa ser maior do que zero (>=0
). Substitua por zero:
Engenharia de características
Antes de criar o modelo, é importante entender os dados e ter certeza de que você passará ao modelo dados formatados corretamente.
Vento
A última coluna dos dados, wd (deg)
, fornece a direção do vento em graus. Ângulos não são boas entradas para modelos: 360° e 0° devem estar próximos um do outro e fecharem um ciclo. A direção não é importante se o vento não estiver soprando.
No momento, veja como está a distribuição dos dados de vento:
Mas será mais fácil para o modelo interpretar se você converter as colunas de direção e velocidade em um vetor de vento:
O modelo tem mais facilidade de interpretar corretamente a distribuição de vetores de vento:
Hora
De maneira similar, a coluna Date Time
(Data e hora) é muito útil, mas não neste formato de string. Comece convertendo em segundos:
De maneira similar à direção do vento, a hora em segundos não é uma entrada muito útil para o modelo. Como são dados do clima, há uma periodicidade diária e anual clara. Há diversas maneiras de tratar a periodicidade.
Você consegue sinais úteis utilizando as transformadas de seno e cosseno para limpar os sinais "Hora do dia" and "Época do ano":
Dessa forma, o modelo terá acesso às características de frequência mais importantes. Neste caso, você sabia de antemão quais frequências eram importantes.
Se você não tiver essas informações, pode determinar quais frequências são importantes por meio da extração de características usando a Transformada rápida de Fourier. Para verificar as hipóteses, aqui está a tf.signal.rfft
da temperatura ao longo do tempo. Observe os picos óbvios nas frequências perto de 1/year
(1/ano) e 1/day
(1/dia):
Divisão dos dados
Você usará uma divisão igual a (70%, 20%, 10%)
para os conjuntos de treinamento, validação e teste. Observe que os dados não estão sendo misturados aleatoriamente antes da divisão por dois motivos:
Isso garante que ainda seja possível dividir os dados em janelas de amostras consecutivas.
Isso garante que os resultados de validação/teste sejam mais realistas, já que a avaliação é feita para os dados coletados após o treinamento do modelo.
Normalização dos dados
É importante mudar a escala das características antes de treinar uma rede neural. A normalização é uma estratégia comum para isso: subtraia a média e divida pelo desvio padrão de cada característica.
A média e o desvio padrão devem ser calculados usando-se somente os dados de treinamento para que os modelos não tenham acesso aos valores dos conjuntos de validação e teste.
Também podemos argumentar que o modelo não deve ter acesso aos valores futuros do conjunto de treinamento durante o treinamento e que essa normalização deve ser feita usando-se médias móveis. Este não é o foco deste tutorial, e os conjuntos de validação e teste garantem que você tenha métricas relativamente honestas. Portanto, por questões de simplicidade, este tutorial utiliza uma média simples.
Agora, confira a distribuição das características. Algumas delas parecem ter cauda longa, mas não há erros óbvios, como o valor -9999
para a velocidade do vento.
Dados em janelas
Os modelos neste tutorial farão um conjunto de previsões com base em uma janela de amostras consecutivas dos dados.
As principais características das janelas de entrada são:
A largura (número de passos temporais) das janelas de entrada e rótulo.
A diferença de hora entre elas.
Quais características são usadas como entrada, rótulo ou ambos.
Este tutorial cria diversos modelos (incluindo modelos lineares, DNN, CNN e RNN) e utiliza-os para:
Fazer previsões de uma saída e várias saídas.
Fazer previsões com um passo temporal e vários passos temporais.
Esta seção se concentra na implementação das janelas de dados para que possam ser reutilizadas em todos os modelos.
Dependendo da tarefa e do tipo de modelo, você vai querer gerar diversas janelas de dados. Veja alguns exemplos:
Por exemplo, para fazer uma única previsão para 24 horas à frente, dadas 24 horas de histórico, você pode definir uma janela desta forma:
Um modelo que faz uma previsão para uma hora à frente, dadas seis horas de histórico, precisaria de uma janela como esta:
O restante desta seção define uma classe WindowGenerator
. Esta classe pode:
Tratar os índices e diferenças, conforme mostrado nos diagramas acima.
Dividir as janelas de características em pares
(features, labels)
(características, rótulos).Plotar o conteúdo das janelas resultantes.
Gerar lotes dessas janelas a partir dos dados de treinamento, avaliação e teste com eficiência usando
tf.data.Dataset
s.
1. Índices e diferenças
Comece criando a classe WindowGenerator
. O método __init__
inclui toda a lógica necessária para os índices de entrada e rótulo.
Ele também recebe DataFrames de treinamento, avaliação e teste como entrada, que serão convertidos em tf.data.Dataset
s de janelas posteriormente.
Veja o código para criar as duas janelas exibidas nos diagramas no começo desta seção:
2. Divisão
Dada uma lista de entradas consecutivas, o método split_window
as converterá em uma janela de entradas e outra de rótulos.
O exemplo w2
definido anteriormente será dividido assim:
Esse diagrama não mostra o eixo features
(características) dos dados, mas a função split_window
também trata as label_columns
(colunas de rótulos), então pode ser usada para exemplos com uma saída e várias saídas.
Faça um teste:
Tipicamente, os dados no TensorFlow são encapsulados em arrays, em que o índice mais externo é usado entre exemplos (a dimensão "lote"). Os índices do meio são as dimensões "hora" ou "espaço" (largura, altura). Os índices mais internos são as características.
O código acima recebeu um lote de três janelas com 7 passos temporais, com 19 características em cada passo temporal. Ele divide em um lote de entradas com 6 passos temporais e 19 características, além de um rótulo com 1 passo temporal e 1 característica. O rótulo tem somente uma característica porque o WindowGenerator
(gerador de janelas) foi inicializado com label_columns=['T (degC)']
. Inicialmente, este tutorial criará modelos que preveem rótulos com uma saída.
3. Gráfico
Veja um método para gerar gráficos que permite uma visualização simples da janela de divisão:
Esse gráfico alinha entradas, rótulos e (posteriormente) previsões com base na hora referente ao item:
Você pode plotar as outras colunas, mas a configuração da janela de exemplo w2
tem somente rótulos para a coluna T (degC)
.
4. Criação de tf.data.Dataset
s
Por fim, o método make_dataset
recebe um DataFrame de série temporal e converte-o em um tf.data.Dataset
de pares (input_window, label_window)
usando a função tf.keras.utils.timeseries_dataset_from_array
:
O objeto WindowGenerator
armazena dados de treinamento, validação e teste.
Adicione propriedades para acessá-los como tf.data.Dataset
s usando o método make_dataset
definido anteriormente. Além disso, acrescente um lote de exemplos padrão para facilitar o acesso e plotar gráficos:
Agora, o objeto WindowGenerator
fornece acesso aos objetos tf.data.Dataset
para que você possa fazer a iteração dos dados com facilidade.
A propriedade Dataset.element_spec
indica a estrutura, os tipos de dados e os formatos dos elementos do dataset.
Ao fazer a iteração de um Dataset
, são obtidos lotes concretos:
Modelos com um passo
O modelo mais simples que você pode criar com esse tipo de dados prevê um único valor de característica — um passo temporal (uma hora) à frente com base somente nas condições atuais.
Então, comece criando modelos para prever o valor de T (degC)
uma hora à frente.
Configure um objeto WindowGenerator
para gerar esses pares (input, label)
(entrada, rótulo) com um passo:
O objeto window
cria tf.data.Dataset
s a partir dos conjuntos de treinamento, validação e teste, o que permite fazer a iteração dos lotes de dados com facilidade.
Linha de base
Antes de criar um modelo treinável, é bom ter uma linha de base de desempenho para fins de comparação com os modelos mais complicados que virão.
A primeira tarefa é prever a temperatura uma hora à frente, dado o valor atual de todas as características. Os valores atuais incluem a temperatura atual.
Portanto, comece com um modelo que retorne apenas a temperatura atual como a previsão, prevendo "Sem alteração". Essa é uma linha de base razoável, já que a temperatura muda aos poucos. Claro que essa linha de base terá desempenho inferior se você fizer uma previsão mais à frente no tempo.
Instancie e avalie o modelo:
Foram exibidas algumas métricas de desempenho, mas elas não indicam se o modelo está se saindo bem.
WindowGenerator
tem um método de plotagem, mas os gráficos não serão muito interessantes com apenas uma amostra.
Portanto, crie um WindowGenerator
mais abrangente, que crie janelas de 24 horas de entradas e rótulos consecutivos por vez. A nova variável wide_window
não altera o funcionamento do modelo, que ainda faz previsões uma hora à frente com base em um único passo temporal de entrada. Aqui, o eixo time
(hora) funciona como o eixo batch
lote: cada previsão é feita de forma independente, sem interação entre os passos temporais:
Essa janela expandida pode ser passada diretamente para o mesmo modelo de linha de base (baseline
) sem qualquer alteração no código, pois as entradas e os rótulos têm o mesmo número de passos temporais, e a linha de base simplesmente encaminha a entrada para a saída.
Ao plotar as previsões do modelo de linha de base, observe que são simplesmente os rótulos deslocados em uma hora:
Nos gráficos acima com três exemplos, o modelo com um passo é executado para 24 horas. Veja a explicação:
A linha azul
Inputs
(entradas) mostra a temperatura de entrada em cada passo temporal. O modelo recebe todas as características, mas esse gráfico mostra apenas a temperatura.Os pontos verdes
Labels
(rótulos) mostram o valor de previsão alvo. Esses pontos são mostrados no momento da previsão, não no momento da entrada. É por isso que o intervalo de rótulos é deslocado em um passo em relação às entradas.As cruzes laranjas
Predictions
(previsões) são a previsão do modelo para cada passo temporal de saída. Se o modelo estivesse prevendo perfeitamente, as previsões ficariam diretamente nosLabels
(rótulos).
Modelo linear
O modelo treinável mais simples que você pode aplicar a esta tarefa é inserir a transformada linear entre a entrada e a saída. Neste caso, a saída de um passo temporal depende apenas desse passo:
Uma camada tf.keras.layers.Dense
com conjunto de ativação (activation
) é um modelo linear. A camada apenas transforma o último eixo dos dados de (batch, time, inputs)
(lote, hora, entradas) em (batch, time, units)
(lote, hora, unidades); ela é aplicada de forma independente a cada item nos eixos batch
(lote) e time
(hora).
Este tutorial treina diversos modelos, então encapsule o procedimento de treinamento em uma função:
Treine o modelo e avalie o desempenho:
Como o modelo de linha de base (baseline
), o modelo linear pode ser chamado nos lotes das janelas largas. Quando usado desta forma, o modelo faz um conjunto de previsões independentes em passos temporais consecutivos. O eixo time
(hora) atua como outro eixo batch
(lote). Não há interações entre as previsões em cada passo temporal.
Veja o gráfico das previsões de exemplo em wide_window
. Observe como, em muitos casos, a previsão é claramente melhor do que apenas retornar a temperatura de entrada. Porém, em alguns casos, é pior:
Uma vantagem dos modelos lineares é que é relativamente simples interpretá-los. Você pode obter os pesos da camada e visualizar o peso atribuído a cada entrada:
Às vezes, o modelo não coloca o mesmo peso na entrada T (degC)
. Esse é um dos riscos da inicialização aleatória.
Modelo denso
Antes de aplicar modelos que podem operar com vários passos temporais, vale a pena verificar o desempenho de modelos com um passo de entrada mais profundos e poderosos.
Veja um modelo similar ao linear
, mas que empilha algumas camadas Dense
entre a entrada e a saída:
Modelo denso com vários passos
Um modelo com um passo temporal não tem o contexto dos valores atuais de suas entradas. Ele não consegue ver como as características de entrada mudam ao longo do tempo. Para resolver esse problema, o modelo precisa de acesso a vários passos temporais ao fazer previsões:
Os modelos baseline
, linear
e dense
trataram cada passo temporal de forma independente. Aqui, o modelo receberá vários passos temporais como entrada para gerar uma única saída.
Crie um WindowGenerator
que gere lotes de entradas de três horas e de rótulos de uma hora:
Observe que o parâmetro shift
de Window
é relativo ao final das duas janelas.
Para treinar um modelo dense
com uma janela de vários passos de entrada, basta adicionar tf.keras.layers.Flatten
como a primeira camada do modelo:
A principal desvantagem dessa estratégia é que o modelo resultante só pode ser executado em janelas de entrada com exatamente o mesmo formato.
Os modelos convolucionais da próxima seção corrigem esse problema.
Rede neural convolucional
Uma camada convolucional (tf.keras.layers.Conv1D
) também recebe vários passos temporais como entrada para cada previsão.
Veja abaixo o mesmo modelo que multi_step_dense
, reescrito com uma convolução:
Observe as alterações:
A camada
tf.keras.layers.Flatten
e a primeira camadatf.keras.layers.Dense
são substituídas por uma camadatf.keras.layers.Conv1D
.A camada
tf.keras.layers.Reshape
não é mais necessária, já que a convolução mantém o eixo de hora em sua saída.
Execute em um lote de exemplo para verificar se o modelo gera as saídas com o formato esperado:
Treine e avalie em conv_window
, e o desempenho deve ser similar ao modelo multi_step_dense
.
A diferença entre conv_model
e multi_step_dense
é que o modelo conv_model
pode ser executado em entradas de qualquer tamanho. A camada convolucional é aplicada a uma janela de entradas deslizante:
Se você executar em uma entrada mais ampla, a saída gerada será mais ampla:
Observe que a saída é mais curta do que a entrada. Para que o treinamento ou a plotagem funcionem, os rótulos e a previsão devem ter o mesmo tamanho. Então, crie um WindowGenerator
que produza janelas largas com alguns passos temporais de entrada adicionais para que o tamanho do rótulo seja igual ao da previsão:
Agora, você pode plotar as previsões do modelo em uma janela maior. Observe os três passos temporais de entrada antes da primeira previsão. Cada previsão é baseada nos três passos temporais anteriores:
Rede neural recorrente
Uma Rede Neural Recorrente (RNN, na sigla em inglês) é um tipo de rede neural adequada para dados de séries temporais. As RNNs processam uma série temporal passo a passo, mantendo o estado interno ao passar de um passo temporal para outro.
Saiba mais no tutorial Geração de texto com uma RNN e no guia Redes Neurais Recorrentes (RNNs) com o Keras.
Neste tutorial, você usará uma camada de RNN chamada Memória Longa de Período Curto (tf.keras.layers.LSTM
– LSTM, na sigla em inglês).
Um argumento importante do construtor de todas as camadas de RNN do Keras, como tf.keras.layers.LSTM
, é o argumento return_sequences
, que pode configurar a camada de duas maneiras:
Quando
False
, o padrão, a camada retorna somente a saída do passo temporal final, dando tempo para o modelo "aquecer" seu estado interno antes de fazer uma previsão:
Quando
True
, a camada retorna uma saída para cada entrada. Isso é útil para:Empilhar camadas de RNN.
Treinar um modelo com vários passos temporais simultaneamente.
Com return_sequences=True
, o modelo pode ser treinado com 24 horas de dados de cada vez.
Observação: isso dará uma visão pessimista do desempenho do modelo. No primeiro passo temporal, o modelo não tem acesso aos passos anteriores e, portanto, não pode fazer nada melhor do que os modelos simples linear
e dense
mostrados anteriormente.
Desempenho
Com este dataset, tipicamente, cada um dos modelos tem um desempenho ligeiramente melhor do que o anterior:
Modelos com várias saídas
Até agora, todos os modelos previram uma única característica de saída, T (degC)
, para um único passo temporal.
Todos esse modelos podem ser alterados para prever várias características, basta mudar o número de unidades na camada de saída e ajustar as janelas de treinamento de forma a incluírem todas as características em labels
(example_labels
):
Observe que agora o eixo features
(características) dos rótulos tem a mesma profundidade que as entradas, em vez de 1
.
Linha de base
O mesmo modelo de linha de base (Baseline
) pode ser usado aqui, porém, desta vez, repetindo todas as características em vez de selecionando um label_index
específico:
Modelo denso
RNN
Avançado: conexões residuais
O modelo de linha de base (Baseline
) anterior aproveitava o fato de que a sequência não muda dramaticamente de um passo temporal para outro. Cada modelo treinado neste tutorial até o momento foi inicializado aleatoriamente e depois teve que aprender que a saída é uma pequena alteração do passo temporal anterior.
Embora seja possível evitar esse problema com uma inicialização cuidadosa, é mais simples incorporar isso à estrutura do modelo.
Em análises de séries temporais, é comum criar modelos que, em vez de previrem o próximo valor, prevejam como o valor vai mudar no próximo passo temporal. De maneira similar, em aprendizado profundo, as redes residuais, ou ResNets, referem-se a arquiteturas em que cada camada acrescenta ao resultado cumulativo do modelo.
É assim que você pode aproveitar o fato de a mudança ser pequena.
Essencialmente, isso inicializa o modelo para que corresponda à linha de base (Baseline
). Para esta tarefa, ajuda o fato de os modelos convergirem mais rápido, com um desempenho ligeiramente superior.
Essa estratégia pode ser usada em conjunto com qualquer modelo discutido neste tutorial.
Aqui, isso está sendo aplicado ao modelo LSTM. Observe o uso de tf.initializers.zeros
para garantir que as mudanças iniciais previstas sejam pequenas e não dominem a conexão residual. Não há preocupações com a quebra de simetria para os gradientes, já que zeros
são usados somente na última camada.
Desempenho
Veja o desempenho geral desses modelos com várias saídas.
Os desempenhos acima são uma média para todas as saídas do modelo.
Modelos com vários passos
Tanto os modelos com uma saída quanto com várias saídas das seções anteriores faziam previsões com um passo temporal, uma hora à frente.
Nesta seção, veremos como expandir esses modelos para fazer previsões com vários passos temporais.
Em uma previsão com vários passos, o modelo precisa aprender a prever um intervalo de valores futuros. Portanto, diferentemente de um modelo com um passo, em que só é preciso prever um ponto futuro, um modelo com vários passos prevê uma sequência de valores futuros.
Veja duas estratégias gerais para isso:
Previsões em etapa única (single-shot), em que toda a série temporal é prevista de uma só vez.
Previsões autorregressivas, em que o modelo faz somente previsões com um passo, e sua saída é alimentada de volta como sua entrada.
Nesta seção, todos os modelos vão prever todas as características para todos os passos temporais de saída.
Para o modelo com vários passos, os dados de treinamento consistem novamente de amostras por hora. Porém, aqui, os modelos aprenderão a prever 24 horas à frente, dadas 24 horas passadas.
Aqui está um objeto Window
que gera esses segmentos do dataset:
Linhas de base
Uma linha de base simples para essa tarefa é repetir o último passo temporal de entrada para o número exigido de passos temporais de saída:
Como esta tarefa é prever 24 horas à frente, dadas 24 horas passadas, outra estratégia simples é repetir o dia anterior, supondo que amanhã será similar:
Modelos single-shot (etapa única)
Uma estratégia de alto nível para esse problema é usar um modelo "single-shot", em que ele faz a previsão de toda a sequência em um único passo.
É possível fazer uma implementação eficiente com uma camada tf.keras.layers.Dense
, com OUT_STEPS*features
unidades de saída. O modelo só precisa mudar o formato da saída para o (OUTPUT_STEPS, features)
exigido.
Linear
Um modelo linear simples baseado no último passo temporal de entrada tem desempenho superior a qualquer linha de base, mas é pouco potente. O modelo precisa prever OUTPUT_STEPS
passos temporais a partir de um único passo temporal de entrada com uma projeção linear. Ele consegue capturar somente um segmento de baixa dimensão do comportamento, provavelmente baseado principalmente na hora do dia e na época do ano.
Modelo denso
Ao adicionar uma camada tf.keras.layers.Dense
à entrada e à saída, o modelo linear fica mais potente, mas ainda baseia-se somente em um único passo temporal de entrada.
CNN
Um modelo convolucional faz previsões baseadas em um histórico de largura fixa, que pode ter um desempenho melhor do que o modelo denso, já que consegue ver como as características mudam ao longo do tempo:
RNN
Um modelo recorrente pode aprender a usar um histórico de entradas longo, se for relevante para as previsões sendo feitas. Aqui, o modelo acumulará o estado interno por 24 horas antes de fazer uma única previsão para as próximas 24 horas.
Nesse formato single-shot (etapa única), a LSTM só precisa gerar uma saída no último passo temporal, então defina return_sequences=False
em tf.keras.layers.LSTM
.
Avançado: modelo autorregressivo
Todos os modelos acima preveem toda a sequência de saídas em um único passo.
Em alguns casos, pode ser útil para o modelo decompor a previsão em passos temporais individuais. Em seguida, cada saída do modelo pode ser alimentada de volta em si mesma em cada passo, e as previsões podem ser feitas condicionadas à anterior, como no tutorial Como gerar sequências com Redes Neurais Recorrentes.
Uma vantagem clara desse estilo de modelo é que ele pode ser configurado para gerar saídas com um tamanho variável.
Você pode pegar qualquer um dos modelos com uma etapa e várias saídas treinados na primeira metade deste tutorial e executá-lo em um loop de feedback autorregressivo, mas aqui seu foco será em criar um modelo que foi treinado explicitamente para fazer isso.
RNN
Este tutorial apenas cria um modelo RNN autorregressivo, mas esse padrão pode ser aplicado a qualquer modelo desenvolvido para gerar um único passo temporal.
O modelo terá a mesma forma básica dos modelos LSTM com um passo anteriores: uma camada tf.keras.layers.LSTM
, seguida por uma camada tf.keras.layers.Dense
que converte as saídas da camada LSTM
em previsões do modelo.
Uma camada tf.keras.layers.LSTM
é uma camada tf.keras.layers.LSTMCell
encapsulada na camada tf.keras.layers.RNN
de alto nível que gerencia o estado e os resultados da sequência para você (confira mais detalhes no guia Redes Neurais Recorrentes (RNNs) com o Keras).
Neste caso, o modelo precisa gerenciar manualmente as entradas em cada passo, então ele usa uma camada tf.keras.layers.LSTMCell
diretamente para a interface do passo temporal de nível mais baixo.
O primeiro método que esse modelo precisa é um método de warmup
("aquecimento") para inicializar seu estado interno com base nas entradas. Após o treinamento, esse estado vai capturar as partes relevantes do histórico de entradas. Isso é equivalente ao modelo LSTM
com um passo anterior:
Esse método retorna uma previsão de passo temporal e o estado interno da LSTM
:
Com o estado da RNN
e uma previsão inicial, agora você pode continuar fazendo a iteração do modelo, alimentando as previsões em cada passo de volta como a entrada.
A estratégia mais simples para coletar as previsões de saída é usar uma lista do Python e tf.stack
após o loop.
Observação: empilhar uma lista do Python dessa forma funciona somente com a execução adiantada (eager), usando Model.compile(..., run_eagerly=True)
para o treinamento ou uma saída de tamanho fixo. Para uma saída de tamanho dinâmico, você precisa usar uma array tf.TensorArray
em vez de uma lista do Python e tf.range
em vez do range
do Python.
Teste a execução desse modelo nas entradas de exemplo:
Agora treine o modelo:
Desempenho
Neste problema, há claramente ganhos decrescentes como uma função da complexidade do modelo:
As métricas dos modelos com várias saídas da primeira metade deste tutorial mostram o desempenho como uma média de todas as características de saída. Estes desempenhos são similares, mas também são feitos como uma média dos passos temporais de saída.
Os ganhos obtidos ao passar de um modelo denso para modelos convolucionais e recorrentes é de apenas alguns pontos percentuais (quando há ganhos), e o modelo autorregressivo teve desempenho claramente inferior. Portanto, talvez essas estratégias mais complexas não valham a pena para este problema, mas não tínhamos como saber sem tentar, e esses modelos podem ser úteis para o seu problema.
Próximos passos
Este tutorial foi uma introdução rápida a uma previsão de série temporal usando o TensorFlow.
Para saber mais, confira:
O capítulo 15 de Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow (Aprendizado de máquina prático com Scikit-Learn, Keras e TensorFlow), 2ª Edition.
O capítulo 6 de Deep Learning with Python (Aprendizado profundo com o Python).
A aula 8 de Intro to TensorFlow for deep learning (Introdução ao TensorFlow para aprendizado profundo) da Udacity, incluindo os notebooks de exercício.
E lembre-se de que você pode implementar qualquer modelo clássico de série temporal no TensorFlow. O foco deste tutorial foi apenas a funcionalidade integrada do TensorFlow.