LSTM na previsão de surtos com dados abertos e Python

Cientista analisando previsão de surtos em painel com gráficos e código Python

LSTM na previsão de surtos virou uma opção prática para equipes que precisam antecipar picos de casos com dados abertos e Python. Em vez de depender apenas de planilhas históricas, o modelo aprende padrões de sequência, sazonalidade e atraso entre sinais epidemiológicos.

Na prática, o ganho aparece quando há séries semanais, ruído moderado e variáveis auxiliares. Este guia mostra o fluxo completo: fontes de dados, preparação, arquitetura em Python, validação temporal e um exemplo de implementação que você pode adaptar para dengue, influenza ou COVID-19.

Por que usar LSTM na previsão de surtos

A LSTM na previsão de surtos faz sentido quando a série temporal tem dependência de longo prazo. Em surtos, isso acontece com frequência: um aumento hoje pode refletir exposição, incubação e notificação com atraso de 1 a 4 semanas, dependendo da doença.

Modelos clássicos, como regressão linear ou média móvel, capturam tendência curta. Já a LSTM lida melhor com sequências mais longas e não lineares. Em estudos de vigilância, ela costuma entrar depois de um baseline simples, não no primeiro passo.

Quando a LSTM vale a pena

Use LSTM quando existir volume mínimo de observações, idealmente mais de 100 a 150 pontos temporais, e quando a série tiver sazonalidade, memória ou efeitos cumulativos. Para dados semanais, isso significa pelo menos dois a três anos de histórico.

Se a base for curta, o ganho pode ser pequeno. Nesse cenário, SARIMA, Prophet ou XGBoost com defasagens podem ser mais estáveis. A regra editorial é clara: a LSTM na previsão de surtos entra depois do diagnóstico do dado, não antes.

Leitura de apoio: WHO Data e OpenDataSUS.

Dados abertos: o que usar e onde buscar

O ponto de partida para LSTM na previsão de surtos é a série temporal de casos. No Brasil, o OpenDataSUS concentra bases úteis para epidemiologia aplicada. Em escala global, o Humanitarian Data Exchange e o WHO Data também ajudam.

Para dengue, influenza ou arboviroses, a granularidade semanal costuma ser mais prática que a diária. Isso reduz ruído de notificação. Um exemplo simples: 156 semanas de histórico equivalem a 3 anos de série, volume suficiente para um primeiro experimento com janela deslizante.

Em epidemiologia, prever cedo vale mais do que prever perfeito.

Variáveis que ajudam a prever surtos

Além dos casos, inclua clima, umidade, chuva, mobilidade, feriados e cobertura vacinal, quando disponível. Em surtos respiratórios, temperatura e mobilidade podem explicar parte da variação. Em doenças vetoriais, chuva e temperatura tendem a ser mais relevantes.

Também vale adicionar defasagens: casos da semana anterior, média móvel de 3 semanas e diferença percentual. Esses atributos simples costumam melhorar muito o desempenho antes mesmo da LSTM. Para dados públicos no Brasil, consulte dados.gov.br.

Pipeline em Python para montar o modelo

Um fluxo sólido de LSTM na previsão de surtos começa com limpeza, padronização e criação de janelas temporais. Em Python, a pilha mais comum inclui pandas, numpy, scikit-learn e TensorFlow/Keras. Para visualização, use matplotlib ou seaborn.

Exemplo de etapas: carregar CSV, converter data, ordenar por semana epidemiológica, preencher faltantes, normalizar a série com MinMaxScaler e gerar sequências com 12 passos de entrada para prever a próxima semana. Em séries semanais, uma janela de 12 a 26 semanas costuma ser um bom ponto de partida.

Exemplo mínimo de preparação

1. Agrupe por semana epidemiológica.
2. Crie variáveis defasadas de 1, 2, 4 e 8 semanas.
3. Escalone os dados apenas no treino.
4. Separe treino, validação e teste por tempo, nunca por sorteio.

Esse detalhe evita vazamento temporal. Em epidemiologia, vazamento pode inflar a métrica e gerar falsa confiança operacional. Para referência técnica em séries temporais, vale consultar a documentação do TimeSeriesSplit.

Código-base de LSTM para séries epidemiológicas

Abaixo está um esqueleto funcional para LSTM na previsão de surtos. Ele prevê o próximo valor da série a partir de uma janela temporal. Ajuste a coluna alvo para casos, internações ou notificações.

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# df: colunas ['date', 'cases']
df = df.sort_values('date').reset_index(drop=True)
values = df[['cases']].values

scaler = MinMaxScaler()
scaled = scaler.fit_transform(values)

def make_sequences(data, window=12):
    X, y = [], []
    for i in range(window, len(data)):
        X.append(data[i-window:i])
        y.append(data[i])
    return np.array(X), np.array(y)

X, y = make_sequences(scaled, window=12)
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

model = Sequential([
    LSTM(64, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True),
    Dropout(0.2),
    LSTM(32),
    Dropout(0.2),
    Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=30, batch_size=16, validation_split=0.2, verbose=1)

Esse modelo é simples, mas já serve para um primeiro benchmark. Em bases reais, você pode adicionar callbacks, early stopping e multivariáveis. Se quiser subir o nível, compare a LSTM com CNN-LSTM ou TCN, que às vezes superam redes recorrentes em séries curtas.

Para um panorama técnico mais amplo, veja TensorFlow LSTM.

Uma LSTM só ajuda se o dado estiver limpo, temporalmente coerente e validado sem vazamento.

Validação, métricas e comparação com baselines

Sem validação correta, LSTM na previsão de surtos vira exercício de overfitting. A avaliação precisa respeitar a ordem temporal. O ideal é usar backtesting com janelas expansíveis ou deslizantes, além de um conjunto final de teste separado por período.

As métricas mais úteis são MAE, RMSE e MAPE. Para surtos, também vale olhar a capacidade de detectar picos. Uma previsão média boa, mas que erra o ápice em duas semanas, pode ser pouco útil para vigilância.

Baselines que você deve bater

Antes de celebrar a LSTM, compare com três referências: persistência ingênua, média móvel e SARIMA. Em muitos cenários, a LSTM só compensa quando há variáveis externas e volume razoável de histórico. Em séries muito ruidosas, o ganho pode ser modesto.

Um caso recorrente em saúde pública é a previsão de dengue em nível municipal. Modelos com clima e defasagens costumam superar a linha de base. Mas o ganho real depende da qualidade da notificação, que pode atrasar de 7 a 14 dias em alguns sistemas.

Para métricas e boas práticas em séries temporais, consulte Forecasting: Principles and Practice.

Erros comuns e ajustes que melhoram a LSTM

O erro mais comum em LSTM na previsão de surtos é treinar com dados mal alinhados. Semana epidemiológica, data de notificação e data de início dos sintomas não são a mesma coisa. Se a série mistura essas datas, a previsão perde sentido.

Outro problema é ignorar mudança de regime. Surtos sofrem intervenção, subnotificação e alteração de comportamento. Isso quebra padrões aprendidos. Em séries com ruptura, vale testar re-treino frequente, regularização maior e janelas menores, por exemplo de 8 a 12 semanas.

Ajustes práticos

Experimente normalização robusta, dropout entre 0,2 e 0,4, early stopping e redução do tamanho da rede. Em muitos casos, duas camadas LSTM bastam. Redes muito profundas aumentam custo e nem sempre melhoram a previsão.

Se o objetivo for operação, gere cenários: previsão pontual, intervalo de confiança e alerta de limiar. Em vigilância, um alarme antecipado de uma semana pode ser mais valioso do que uma curva bonita. Para dados e séries no ecossistema Python, veja pandas e TensorFlow.

A IAIRON Academy ensina IA aplicada de forma prática. Conheça aqui.

Perguntas Frequentes

LSTM serve para prever surtos de dengue?
Sim, especialmente quando há série histórica semanal, clima e defasagens. A LSTM tende a funcionar melhor em dados com sazonalidade e memória temporal. Ainda assim, compare com baselines simples antes de usar em produção.
Quantos dados preciso para treinar uma LSTM epidemiológica?
Para um primeiro teste, busque pelo menos 100 a 150 pontos temporais. Em séries semanais, isso equivale a 2 ou 3 anos de dados. Quanto mais variáveis externas e melhor a qualidade da série, maior a chance de ganho.
Qual biblioteca usar em Python para LSTM?
A combinação mais comum é pandas, numpy, scikit-learn e TensorFlow/Keras. Essa pilha cobre limpeza, normalização, criação de sequências e treino do modelo. Para validação temporal, use TimeSeriesSplit do scikit-learn.
LSTM é melhor que SARIMA para previsão de surtos?
Nem sempre. SARIMA pode vencer em séries curtas e mais lineares. A LSTM ganha espaço quando há não linearidade, múltiplas variáveis e dependências mais longas.
Quais métricas avaliar na previsão de surtos?
MAE, RMSE e MAPE são as mais usadas. Para vigilância, também vale medir acerto do pico, atraso na previsão e capacidade de detectar semanas críticas. Métrica única raramente conta a história toda.
pettrus
Sobre o autor

pettrus

Editor IAIRON — Inteligência Artificial aplicada ao mercado brasileiro.