Modelos e bibliotecas¶
A maior parte dos modelos é um adaptador fino sobre uma biblioteca conhecida
(scikit-learn, statsmodels, StatsForecast, LightGBM …): o adaptador cuida do que é
específico de séries temporais (janelas de lags, diferenciação, previsão recursiva,
contexto temporal) e delega o ajuste à biblioteca de origem. Métodos simples sem uma
implementação de referência adequada — baselines, regressão harmônica e os métodos de
demanda intermitente — são implementados em numpy na própria AutoHybTS e marcados como
“próprio (numpy)” nas tabelas. O nome curto é o que se passa para create_model e
create_hybrid, e é o que aparece no leaderboard.
exp.models() # nome, papel (base/corretor), família, capacidades e extra necessário
Modelos-base¶
Nome |
Família |
Implementação |
Instalação |
|---|---|---|---|
|
statistical |
próprio (numpy): repete o último valor |
núcleo |
|
statistical |
próprio (numpy): repete a última temporada |
núcleo |
|
statistical |
|
extra |
|
linear |
|
núcleo (scikit-learn) |
|
kernel |
|
núcleo (scikit-learn) |
|
kernel |
|
núcleo (scikit-learn) |
|
tree |
|
núcleo (scikit-learn) |
|
tree |
|
núcleo (scikit-learn) |
|
neural |
|
núcleo (scikit-learn) |
Esses nove formam a busca padrão. Os modelos abaixo estão registrados, mas só entram
quando pedidos (base_models=[...], create_model): controles simples para
comparar estruturas compostas e boosting sobre lags.
Nome |
Família |
Implementação |
Instalação |
|---|---|---|---|
|
statistical |
próprio (numpy): média do treino, congelada |
núcleo |
|
statistical |
próprio (numpy): média das últimas |
núcleo |
|
statistical |
próprio (numpy): média de cada posição sazonal nas últimas |
núcleo |
|
statistical |
próprio (numpy): último valor + |
núcleo |
|
statistical |
|
extra |
|
statistical |
|
extra |
|
statistical |
próprio (numpy): regressão harmônica dinâmica, com tendência, pares de Fourier
para cada período de |
núcleo |
|
linear |
|
núcleo (scikit-learn) |
|
tree |
|
núcleo (scikit-learn) |
|
tree |
|
núcleo (scikit-learn) |
|
tree |
|
núcleo (scikit-learn) |
|
tree |
|
extra |
|
tree |
|
extra |
|
tree |
|
extra |
Os modelos automáticos do StatsForecast (sf_auto_arima, sf_auto_ets,
sf_auto_theta, sf_auto_ces; extra nixtla-stats, que traz pandas 2.x) têm página
própria: StatsForecast (Nixtla).
Os modelos de boosting rodam com uma thread por modelo: em séries de poucas centenas de
pontos, as threads do OpenMP custam mais do que economizam. O paralelismo do
experimento continua entre candidatas (n_jobs).
Os modelos do scikit-learn viram previsores de séries pelo mesmo adaptador
(LagRegressionForecaster): aprendem y[t] a partir de y[t-1], …, y[t-lags],
com diferenciação e padronização opcionais ajustadas só no treino, e preveem vários
passos de forma recursiva. Os hiperparâmetros do estimador vão em estimator_params:
exp.create_model("knn", lags=14, estimator_params={"n_neighbors": 3})
A padronização (scale) é ajustada no treino: True (padrão) usa uma média e um
desvio da série; "columns" padroniza cada defasagem e o alvo separadamente, como o
StandardScaler do scikit-learn em X e y; False não padroniza. Modelos lineares e
árvores não mudam com a escolha; KNN e SVR mudam, porque dependem das distâncias. Os
corretores aceitam as mesmas opções. Com scale="columns", a AutoHybTS reproduz
exatamente os quatro híbridos com corretor KNN do projeto de replicação.
Demanda intermitente¶
Para séries com muitos zeros (vendas esparsas, peças de reposição), quatro métodos
formam a família intermittent. São modelos-base, não combinações de candidatas:
Nome |
Previsão (constante no horizonte) |
Parâmetros |
|---|---|---|
|
Croston com a correção de Syntetos-Boylan: |
|
|
Teunter-Syntetos-Babai: probabilidade de demanda (suavizada todo período) × tamanho (suavizado quando há demanda); decai quando a demanda para |
|
|
soma em blocos de |
|
|
média das previsões do ADIDA nos níveis |
|
Todos são implementados em numpy, rodam nas variantes A e B (o nível de agregação é
aprendido no treino; as recursões leem o contexto) e nunca preveem valores negativos.
Uma série com valores negativos não é demanda: o ajuste é recusado e a tentativa fica
SKIPPED. Os diagnósticos de cada tentativa trazem o perfil da série no treino:
fração de zeros, intervalo médio entre demandas (ADI) e CV² dos tamanhos.
A família entra na cadeia de seleção só quando um desses modelos está em
base_models, logo antes dos híbridos residuais; sem eles, o protocolo padrão não
muda. Em demanda intermitente, prefira metrics=["RMSSE", ...]: métricas baseadas no
erro absoluto (MASE, MAE) favorecem prever zero.
y = get_data("intermittent_daily")
exp = AutoHybridExperiment(
fh=14, metrics=["RMSSE", "MASE"], base_models=["naive", "croston_sba", "tsb", "imapa"]
).fit(y)
Corretores de resíduos¶
Nome |
Implementação |
Instalação |
|---|---|---|
|
|
núcleo (scikit-learn) |
|
|
núcleo (scikit-learn) |
|
|
núcleo (scikit-learn) |
Corretores opcionais (fora da grade padrão; use correctors=[...] ou
create_hybrid): svm, tree, random_forest, hist_gradient_boosting,
adaboost_r2, lightgbm_regressor, xgboost_regressor e catboost_regressor
(os três últimos no extra boosting), com as mesmas implementações dos modelos-base,
agora sobre janelas de resíduos.
Corretores de sequência residual¶
Um corretor de janelas regride o próximo resíduo nos window anteriores e é iterado
passo a passo. Um corretor de sequência é um modelo de série temporal da própria
série de resíduos: é ajustado uma vez nos resíduos fora da amostra contíguos do treino e
prevê o vetor residual do horizonte inteiro a partir do histórico residual disponível na
origem. Modelos de estado (ARIMA, suavização exponencial) precisam do histórico residual
completo para os seus estados, o que uma janela fixa não dá.
Nome |
Modelo sobre os resíduos |
Instalação |
|---|---|---|
|
|
extra |
|
|
extra |
exp.create_hybrid("seasonal_naive", "arima_sequence")
# parâmetros do modelo sobre os resíduos:
exp.create_hybrid("linear", "arima_sequence",
corrector_params={"model_params": {"order": (1, 0, 0)}})
Funcionam no híbrido aditivo (e em estágios), nas variantes A e B: na B, novas
observações estendem a série de resíduos sem reajuste. A janela não se aplica a eles:
na busca, cada um é proposto com a primeira janela de residual_windows só. Estratégias
que exigem um corretor de janelas (decomposição, combinação de corretores, seleção
dinâmica) não os propõem, e uma candidata montada à mão com eles fica SKIPPED.
Capacidades¶
exp.models() mostra o que cada modelo declara. Além de multi_step e
online_state_update (variantes A e B), training_scope (local, global,
pretrained), output_type (point, quantile, samples,
distribution), target_mode (univariate, multivariate, exogenous),
horizon_strategy e max_horizon descrevem o modelo. A busca compara previsões pontuais por série, com ajustes locais;
modelos globais, saídas não pontuais, múltiplos alvos e horizontes incompatíveis
são SKIPPED sem ajuste. Covariáveis são suportadas quando o experimento recebe
X e a base declara accepts_exog=True. Isso é distinto de
target_mode="exogenous", cujo contrato obrigatório não é aceito pela busca atual.
Consulte Estratégias de sistemas híbridos para as combinações de estratégias e Variáveis exógenas
para disponibilidade temporal das covariáveis.
Métricas¶
MASE (padrão de ordenação), MAE, RMSE, sMAPE, MAPE, MdAPE, WAPE, RRMSE, RMAE (MAE / média do
observado, como no protocolo de replicação) e RMSSE (raiz do erro quadrático médio
escalado pela diferença sazonal ao quadrado do treino, com o mesmo m da MASE; o M5
usa m = 1). Escolha com
metrics=[...]; a primeira ordena e seleciona. Fórmulas e casos indefinidos em
Ler os resultados.
Outras dependências¶
Partes fora dos modelos também usam bibliotecas externas, sempre importadas só na hora
do uso (import autohybts carrega apenas numpy, pandas e o próprio pacote):
Recurso |
Biblioteca |
Instalação |
|---|---|---|
decomposição |
|
extra |
testes estatísticos na comparação e na seleção |
|
núcleo |
|
|
extra |
gráficos |
|
extra |
leitura do M3 |
|
extra |
Sem o extra necessário, o modelo ou recurso falha com UnsupportedCapabilityError
dizendo o que instalar; na busca automática, a candidata vira SKIPPED e as outras
seguem. A origem dos dados (Rdatasets, M4, M3) está em Dados e séries de referência.
Modelos próprios¶
Modelos de PyTorch, TensorFlow/Keras ou de qualquer outra biblioteca entram por registro
(exp.register_model) e passam a valer em todo o experimento: veja
Modelos próprios: PyTorch, TensorFlow e outras bibliotecas.
Ver também
Tutoriais: 12. Baselines, boosting e corretores opcionais, 14. Demanda intermitente.