Coleção aprendizado

Ajustar hiperparâmetros

Avalia configurações por validação cruzada nos dados recebidos e reajusta a melhor configuração em todas as linhas.

O que o bloco faz

Avalia configurações por validação cruzada nos dados recebidos e reajusta a melhor configuração em todas as linhas.

Antes de continuar

Termos que esta página usa, em poucas palavras. As definições completas estão no glossário.

Treino e teste
Dividir os dados em uma parte para ajustar o modelo (treino) e outra, guardada, para medir o desempenho (teste). O teste só é honesto se o modelo nunca o viu durante o ajuste.
Sobreajuste
Quando o modelo aprende o ruído dos dados de treino junto com o padrão, e por isso acerta muito no treino e pouco em dados novos. Modelos mais flexíveis correm mais esse risco.
Validação cruzada
Repetir a divisão treino/teste várias vezes, cada vez deixando uma parte diferente dos dados de fora, e fazer a média do desempenho. Dá uma estimativa mais estável do erro em dados novos do que uma única divisão.
Hiperparâmetro
Uma configuração do método escolhida antes do ajuste, como a profundidade de uma árvore ou o número de árvores de uma floresta. Costuma ser escolhida por validação cruzada, nunca olhando o conjunto de teste.
Matriz de confusão
A tabela que cruza a classe verdadeira com a classe prevista. Dela saem acurácia, sensibilidade, especificidade e precisão, que podem contar histórias diferentes quando as classes têm tamanhos muito diferentes.

Quando usar

Conecte apenas treino. Mantenha o teste separado até a avaliação final.

Pressupostos

  • Entra só o treino: os folds saem das linhas recebidas e o vencedor é reajustado nelas todas. Se o teste entrar aqui, ele deixa de ser teste — a saída teste do ml/split é recusada (tr_ml_error_test_leak); uma divisão feita por fora não tem marca e depende de você.

    Se falhar: Ligue a saída treino do ml/split; a teste vai só ao models/predict.

  • Nenhum preditor revela a resposta (identificador, código que a embute, medida tomada depois do desfecho).

    Verificar:Resumo

    Se falhar: Tire essas colunas de preditores (ou com o data/select antes do ml/split).

  • Os folds refletem a dependência dos dados: aleatoria (estratificada pela classe) supõe linhas independentes; grupo põe cada indivíduo, lote ou área num só fold; temporal usa origem móvel com janela crescente — cada fold treina no passado e valida no bloco seguinte, nunca no futuro do treino. Folds aleatórios com dados dependentes dão erro otimista (Roberts et al. 2017).

    Se falhar: Escolha estrategia = "grupo" com grupo, ou "temporal" com ordem, e use a mesma estratégia no ml/split.

  • Na classificação, cada fold de validação precisa das duas classes (ou de todas): com folds por grupo e grupos de uma classe só, um fold pode validar uma classe apenas, e nele macro F1, kappa e acurácia balanceada degeneram. O bloco avisa e guarda a nota (nota).

    Se falhar: Use estrategia = "grupo_estratificado", que distribui os grupos inteiros equilibrando as classes entre os folds (como o StratifiedGroupKFold do scikit-learn), ou menos folds.

  • A média dos folds do vencedor é otimista: foi a melhor entre muitas tentativas, e parte da vantagem é sorte. Ela serve para escolher, não para reportar o desempenho.

    Verificar:Visualizar tuning

    Se falhar: Reporte o desempenho medido no teste com models/predict e models/evaluate. Sem teste separado (n pequeno), use o ml/nested_cv, que estima o procedimento inteiro sem reaproveitar as linhas da escolha.

  • A métrica escolhida é a que importa no problema; auto usa RMSE (regressão) e macro F1 (classificação).

    Verificar:Agrupar e resumir

    Se falhar: Com classes desequilibradas, prefira balanced_accuracy ou macro_f1 a accuracy.

  • As tentativas bastam para o espaço de busca (busca aleatória): se o melhor ainda melhora perto do fim, o orçamento foi curto.

    Verificar:Visualizar tuning

    Se falhar: Aumente tentativas ou mude a amplitude.

  • O resultado depende da semente: outra semente muda a divisão, os folds ou o próprio ajuste, e com poucos dados a diferença pode ser grande.

    Se falhar: Repita com outras sementes e leia a variação; não escolha a semente pelo resultado.

Configuração

modelo aceita CART, FIGS, forest, SVM ou XGBoost; metrica escolhe medida (auto usa RMSE ou macro F1); tentativas define orçamento; folds define partições; amplitude escolhe limites conservadores/amplos; com CART cada ajuste inclui a poda 1-EP, com validação cruzada interna própria (até 10 ajustes extras por fold), e cp fica fora da busca; estrategia forma os folds: aleatoria (estratificada pela classe), grupo (cada grupo de grupo num só fold) ou temporal (origem móvel com janela crescente: os instantes de ordem formam folds + 1 blocos contíguos e o fold i treina nos blocos 1 a i e valida no bloco i + 1, nunca no passado do treino); seed reproduz a busca. Também recebe resposta, preditores e tarefa.

Na classificação, se algum fold de validação tiver uma classe só (comum com grupo quando cada grupo tem uma classe), macro F1, kappa e acurácia balanceada degeneram nele: o bloco avisa e guarda a nota em nota. A saída é trocar para grupo_estratificado ou usar menos folds.

Exemplo

d <- trama.ml::tr_ml_example("mtcars")
z <- trama.ml::tr_ml_tune(d, resposta = "mpg", modelo = "cart", tentativas = 4, folds = 3)
z$modelo
head(z$historico)

Como interpretar

A saída modelo é o vencedor reajustado; historico registra configurações, resultado por fold, média e melhor valor acumulado.

Teste recusado

A saída teste do ml/split é recusada aqui (tr_ml_error_test_leak): ajustar nela treinaria no teste. Ligue a saída treino; o teste vai só ao ml/predict.

Implementação

  • trama.ml::tr_ml_tune() versão 0.5.7Implementação própria: busca aleatória (log-uniforme para cost, gamma e eta) avaliada nos mesmos k folds (aleatórios estratificados, por grupo ou de origem móvel no tempo); o vencedor, pela média, é reajustado com tr_ml_fit em todas as linhas.

No código O bloco chama trama.ml::tr_ml_tune(), em trama.ml/R/tuning.R:180.

A conta é implementada pelo próprio trama, sem um pacote R de referência por trás.

Outras funções de pacotes que o bloco usa (15)

Referências

Teoria

  • Stone, M. (1974). Cross-Validatory Choice and Assessment of Statistical Predictions. Journal of the Royal Statistical Society. Series B, 36(2), 111-133. doi:10.1111/j.2517-6161.1974.tb00994.x
  • Bergstra, J.; Bengio, Y. (2012). Random Search for Hyper-Parameter Optimization. Journal of Machine Learning Research, 13, 281-305. https://www.jmlr.org/papers/v13/bergstra12a.html
  • Roberts, D. R.; Bahn, V.; Ciuti, S.; Boyce, M. S.; Elith, J.; Guillera-Arroita, G.; Hauenstein, S.; Lahoz-Monfort, J. J.; Schröder, B.; Thuiller, W.; Warton, D. I.; Wintle, B. A.; Hartig, F.; Dormann, C. F. (2017). Cross-validation strategies for data with temporal, spatial, hierarchical, or phylogenetic structure. Ecography, 40(8), 913-929. doi:10.1111/ecog.02881
  • Tashman, L. J. (2000). Out-of-sample tests of forecasting accuracy: an analysis and review. International Journal of Forecasting, 16(4), 437-450. doi:10.1016/S0169-2070(00)00065-0

Livro-texto

Complementar

  • Bergmeir, C.; Hyndman, R. J.; Koo, B. (2018). A note on the validity of cross-validation for evaluating autoregressive time series prediction. Computational Statistics & Data Analysis, 120, 70-83. doi:10.1016/j.csda.2017.11.003
  • Varma, S.; Simon, R. (2006). Bias in error estimation when using cross-validation for model selection. BMC Bioinformatics, 7, 91. doi:10.1186/1471-2105-7-91

Ver a bibliografia completa do trama