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ó aomodels/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 odata/selectantes doml/split).Os folds refletem a dependência dos dados:
aleatoria(estratificada pela classe) supõe linhas independentes;grupopõe cada indivíduo, lote ou área num só fold;temporalusa 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"comgrupo, ou"temporal"comordem, e use a mesma estratégia noml/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/predictemodels/evaluate. Sem teste separado (n pequeno), use oml/nested_cv, que estima o procedimento inteiro sem reaproveitar as linhas da escolha.A métrica escolhida é a que importa no problema;
autousa RMSE (regressão) e macro F1 (classificação).Verificar:Agrupar e resumir
Se falhar: Com classes desequilibradas, prefira
balanced_accuracyoumacro_f1aaccuracy.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
tentativasou mude aamplitude.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 paracost,gammaeeta) avaliada nos mesmos k folds (aleatórios estratificados, por grupo ou de origem móvel no tempo); o vencedor, pela média, é reajustado comtr_ml_fitem 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)
stats::setNames(fold_de, grupos)stats::setNames(sample(rep(seq_len(k), length.out = length(grupos))), grupos)par(unname(which(id[g] == i)))stats::runif(1L, log(z[[1]]), log(z[[2]]))stats::runif(1L, z[[1]], z[[2]])stats::setNames(out, names(space))stats::predict(modelo$ajuste, x, type = "response")stats::predict(modelo$ajuste, x, type = "prob")stats::predict(modelo$ajuste, new_data = x, type = "prob")stats::predict(modelo$ajuste, new_data = x)stats::predict(modelo$ajuste, data = x)stats::predict(modelo$ajuste, x, probability = cls)stats::predict(modelo$ajuste, data.matrix(x))stats::setNames(as.list(c(valores, rep(NA_real_, folds - length(valores)))), paste0("fold_", seq_len(folds)))stats::sd(valores)
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
- James, G.; Witten, D.; Hastie, T.; Tibshirani, R. (2021). An Introduction to Statistical Learning: with Applications in R. 2. ed. New York: Springer. doi:10.1007/978-1-0716-1418-1
- Kuhn, M.; Johnson, K. (2013). Applied Predictive Modeling. New York: Springer. doi:10.1007/978-1-4614-6849-3
- Hyndman, R. J.; Athanasopoulos, G. (2021). Forecasting: Principles and Practice. 3. ed. Melbourne: OTexts, sec. 5.10. https://otexts.com/fpp3/tscv.html
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