Solução de problemas

“fold=’auto’: o histórico comporta N origem(ns) por camada”

A série é curta demais para 7 origens por camada. O experimento usa o maior número que cabe (exp.fold_) e avisa porque a regra de aceite foi calibrada para 7: com menos unidades, ela aceita estruturas espúrias com mais frequência. Use um fh menor, uma série mais longa ou leia as decisões com cautela; um fold inteiro silencia o aviso, mas não muda o risco.

Um modelo aparece como SKIPPED

O motivo está no ledger (result.search.ledger_frame(), coluna reason) ou na mensagem de create_model. Os casos comuns:

  • extra ausente: a mensagem traz o comando pip install "autohybts[...]";

  • modelo incompatível com a variante B (não incorpora observações sem reajuste);

  • série sem sazonalidade declarada (seasonal_naive, sarima, STL com período 1);

  • capacidades fora da busca: modelo global, saída não pontual ou horizonte máximo menor que o pedido.

A busca segue com os outros modelos; só “nenhuma candidata válida” interrompe a execução.

DataValidationError no fit

A biblioteca não reordena, não reamostra, não remove duplicatas e não preenche faltantes em silêncio. A mensagem diz o que corrigir:

  • valores ausentes (NaN): trate-os antes, com o critério do seu domínio;

  • datas duplicadas ou fora de ordem: agregue ou ordene a série;

  • frequência irregular ou lacunas nas datas: reindexe a série na frequência certa e decida como preencher; ou informe frequency.

Meu híbrido foi recusado

Veja result.decisions: reason_codes diz qual critério falhou e median_gain/win_rate mostram por quanto (Ler os resultados). Recusar é o comportamento esperado quando o ganho não é robusto: o modelo mais simples continua. Não ajuste limiares para fazer um híbrido passar; se precisar medir a regra, use autohybts.benchmarks.calibration (Avaliar o próprio procedimento).

A busca demora

O custo é proporcional a candidatas × origens × ajustes por candidata (Espaço de busca e orçamento). Para explorar rápido: budget="smoke", fold=3 (com a ressalva da calibração) e menos base_models/correctors. n_jobs avalia candidatas em paralelo sem mudar o resultado. max_wall_time_s limita o tempo, mas torna o resultado dependente da máquina. Modelos caros: sarima em séries diárias longas, AutoARIMA, redes na CPU (o MambaNet em especial).

O resultado mudou de uma máquina para outra

Com a mesma série, a mesma session_id e os mesmos parâmetros, a busca é a mesma. Diferenças vêm de: max_wall_time_s (o prazo corta propostas diferentes), GPU ou TensorFlow (não determinismo residual) e versões diferentes das bibliotecas. O manifesto de um modelo salvo (read_manifest) registra as versões usadas.

SealedTestAccessError ao avaliar de novo

evaluate_external lê o teste selado uma única vez por modelo finalizado. Repetir a leitura transformaria o teste em validação. Guarde o resultado da primeira chamada (external = exp.evaluate_external(final)); para comparar vários modelos no teste, use exp.compare_external(), que avalia cada um uma vez.

predict_model recusa vários passos na variante B

Um modelo da variante B prevê um passo por vez. Use fh=1 ou final.stream(), que alterna predict_next e observe (Variantes A e B: como a previsão encontra o futuro).

load_model exige trusted=True

Carregar um modelo desserializa pickle, o que executa código. trusted=True declara que o arquivo é de origem confiável; para verificar a integridade, passe sha256= (o hash recebido por um canal confiável) ou signing_key= (Persistência e evidências).

StatsForecast e pandas 3

As versões atuais do StatsForecast exigem pandas < 3. Instale o extra nixtla-stats num ambiente separado (StatsForecast (Nixtla)); sem ele, os modelos sf_* ficam SKIPPED.