Machine Learning · Insper

AutoML

Como gastar o orçamento da busca

Grade, busca aleatória, otimização bayesiana, TPE, halving sucessivo e as duas maneiras como uma busca automática falha

A pergunta que nenhuma aula fez

  • Todo modelo vem com botões; Seleção de Modelos explicou o que eles fazem, Validação Cruzada como comparar os resultados com honestidade.
  • Uma grade com 5 hiperparâmetros e 5 valores cada: 3.125 validações cruzadas, a maioria em regiões que já se mostravam ruins depois das primeiras doze.

otimização de hiperparâmetros

trata a própria busca como um problema de otimização

AutoML (aprendizado de máquina automatizado)

leva a mesma ideia ao pipeline inteiro: pré-processamento, família, hiperparâmetros, o ensemble final

O caminho desta aula

  1. Enquadrar a buscauma caixa-preta cara e ruidosa; o espaço de busca
  2. Grade ou aleatóriaBergstra & Bengio, medido
  3. Uma busca que aprendeotimização bayesiana, estimador de Parzen, Optuna
  4. Cortar tentativas ruinspoda, halving sucessivo, Hyperband
  5. Automatizar e conferiro pipeline inteiro, vazamentos, um escore otimista
Cada etapa responde a uma pergunta: o que estamos otimizando e em qual espaço? → sem memória: grade ou aleatória? → as tentativas passadas podem escolher a próxima? → por que pagar inteira uma tentativa ruim? → até onde a automação vai e onde ela falha?
Etapa 1 · o que estamos otimizando e em qual espaço?

Uma chamada à caixa-preta

\(\lambda\): uma configuração. \(f(\lambda)\): o seu escore de validação cruzada (CV). Ajustar = encontrar o \(\lambda\) com o maior \(f(\lambda)\).

  • kc1: 2.109 módulos de software de um sistema de voo da NASA, 21 métricas de código; alvo: um defeito foi encontrado depois? (15,5% com defeito)
  • Uma chamada = a área sob a curva ROC (ROC AUC) em CV 5-fold de um modelo de boosting.
Preveja. A mesma configuração, validada com 5 embaralhamentos diferentes dos folds. Ela marca o mesmo escore todas as vezes?

Cara, ruidosa e uma caixa-preta

ajustes5 embaralhamentos dos foldsmédia
valores padrão0,760 · 0,776 · 0,767 · 0,769 · 0,7690,768
árvores pequenas e lentas0,795 · 0,806 · 0,804 · 0,803 · 0,8050,803

cara

cada chamada são 5 ajustes; num projeto real, minutos ou horas. O orçamento é o número de chamadas.

ruidosa

de 0,760 a 0,776 para os mesmos ajustes: uma diferença de 0,01 talvez não seja real

caixa-preta

não há gradiente em relação a min_samples_leaf; inteiros, categorias, botões condicionais

Um método de ajuste é uma regra para escolher o próximo \(\lambda\), dados os que já foram avaliados.

Desenhando o espaço (1): a escala

Preveja. Sorteie uma taxa de aprendizado uniforme entre 0,001 e 1. Que fração dos sorteios cai em \([0{,}001;\ 0{,}01)\)?
taxa de aprendizado emuniformelog-uniforme
[0,001; 0,01)0,9%33,5%
[0,01; 0,1)9,1%33,2%
[0,1; 1)90,0%33,3%

À mão: \(0{,}009 / 0{,}999 = 0{,}9\%\); na escala log, cada uma das 3 décadas recebe um terço.

Tudo o que age de forma multiplicativa (taxas de aprendizado, C, alpha, número de folhas ou de vizinhos) ganha escala log: loguniform ou log=True no Optuna.

Desenhando o espaço (2): botões condicionais

  • C pertence à regressão logística, max_leaf_nodes ao boosting, gamma a um kernel RBF (de base radial).
  • Uma grade única sobre todos eles combinaria cada C com cada tamanho de árvore: a mesma regressão logística, ajustada repetidamente.
O espaço de busca é uma árvore: primeiro escolha a família, depois os botões dessa família. Seleção de Modelos usou uma lista de grades; o Optuna vai escrevê-la como um if.
Etapa 2 · buscar sem memória

Grade ou aleatória? O argumento

  • Um escore que depende de um hiperparâmetro \(x_1\) (uma lombada de largura 0,05); os outros \(d - 1\) não fazem nada.
  • Uma grade com \(k\) valores por eixo custa \(k^d\) avaliações, mas testa \(x_1\) em apenas \(k\) valores.
  • A busca aleatória com orçamento \(B\) testa \(x_1\) em \(B\) valores, qualquer que seja \(d\).
Preveja. 81 avaliações sobre 4 hiperparâmetros (uma grade 3 × 3 × 3 × 3). Como essa grade se compara com uma grade 3 × 3 de só 9 avaliações?

Grade ou aleatória? Medido em 4.000 problemas

dorçamentogradealeatória
290,3780,629
2810,8240,985
3270,3780,900
4810,3780,986
42560,5010,998
Uma grade 3 × 3 testa o hiperparâmetro importante em apenas 3 valores, 9 pontos aleatórios em 9; melhor escore médio contra o orçamento

Melhor escore médio. A grade paga cada eixo irrelevante com uma multiplicação do seu custo; a busca aleatória não paga nada (Bergstra & Bengio, 2012).

Simulador: mesmo orçamento, buscas diferentes

Preveja. Orçamento 81: quantos valores distintos de \(x_1\) a grade 9 × 9 testa e quantos a busca aleatória testa?

Etapa 3 · as tentativas passadas podem escolher a próxima?

Otimização bayesiana: uma busca que aprende

A busca aleatória sorteia a 27.ª configuração exatamente como a primeira. Quando cada avaliação custa uma hora, isso é desperdício.

  1. ajuste um modelo substituto barato aos pares (configuração, escore) vistos até agora: ele prevê o escore em qualquer ponto, com uma incerteza;
  2. escolha a próxima configuração maximizando uma função de aquisição: exploração local (escore previsto alto) contra exploração (incerteza alta);
  3. avalie, acrescente ao histórico, repita.

Um escore de mentira, com verdade conhecida: um pico largo de 0,78 em 0,25 e outro, mais alto e mais estreito, de 0,82 em 0,72.

O substituto: um processo gaussiano (GP)

Três avaliações até agora: 0,15 e 0,35 (0,72943), 0,95 (0,700). Melhor até agora: \(f^+ = 0{,}72943\).

\(x\)média \(\mu\)dp \(\sigma\)leitura
0,250,730760,00419entre dois pontos: quase certo, logo acima de \(f^+\)
0,550,722120,01246longe de qualquer ponto: abaixo de \(f^+\), três vezes mais incerto
0,720,713900,01318o pico verdadeiro, mas o substituto não sabe nada dele
Preveja. Qual dos três merece a próxima avaliação?

Melhoria esperada (EI), à mão

\[ \mathrm{EI}(x) = \underbrace{(\mu - f^+)\,\Phi(z)}_{\text{exploração local}} + \underbrace{\sigma\,\varphi(z)}_{\text{exploração}}, \qquad z = \frac{\mu - f^+}{\sigma} \]
\(x\)\(z\)\((\mu - f^+)\Phi(z)\)\(\sigma\varphi(z)\)EI
0,25+0,32+0,000830,001590,00242
0,55−0,59−0,002030,004170,00214
0,72−1,18−0,001850,002620,00077
Em 0,25 quem trabalha é a média; em 0,55 é a incerteza, que quase vence. A função cara é avaliada uma vez por iteração; o substituto barato é consultado milhares de vezes.

Quatro iterações

Quatro iterações de otimização bayesiana: a primeira explora localmente o pico pequeno em 0,25, a segunda explora o vão e cai no pico alto em 0,72, as duas últimas refinam em volta dele

1: explora localmente 0,25 → 0,780. 2: a EI ali desaba, então ela explora o vão → 0,72, 0,820. 3–4: refinam em 0,685 e 0,775. A busca aleatória precisaria de uns 28 sorteios para cair tão perto de 0,72.

As hipóteses do substituto importam

100 rodadas a partir de trios iniciais aleatórios, 30 avaliações cada. Fração das rodadas que chegaram a 0,81:

em até 10em até 20em até 30
bayesiana, escala de comprimento 0,1540%65%65%
bayesiana, escala de comprimento 0,1061%92%92%
busca aleatória37%54%65%
Com 0,15 o substituto tem certeza demais de que o escore é suave: prevê um 0,70 plano e certo sobre o pico estreito e para de procurar. Um modelo errado toma decisões erradas com confiança.

TPE: modelar \(x\) dado o escore

  • Tree-structured Parzen Estimator: separe as tentativas nas boas (a melhor fração \(\gamma\)) e no resto.
  • Densidade dos valores bons \(\ell(x)\), densidade dos outros \(g(x)\): uma lombada gaussiana por tentativa.
  • Amostre onde \(\ell(x)/g(x)\) é maior (Bergstra et al., 2011).
\(x\)0,10,250,50,70,9
\(\ell / g\)0,031,240,455,730,09
12 tentativas aleatórias, 2 das 3 boas perto de 0,68: a próxima tentativa vai para 0,710, que marca 0,817. Um par de densidades unidimensionais por botão: inteiros, categorias e botões condicionais são fáceis.

Optuna: TPE contra busca aleatória, medido

Seis hiperparâmetros: um importa muito, um importa pouco, quatro não importam nada. Melhor possível: 0,870. 20 sementes.

Preveja. Depois de 10 tentativas, quem está à frente?
melhor médio depois de10204060 tentativas
aleatória0,8120,8190,8300,843
TPE0,8120,8470,8570,860

Idênticos em 10: as 10 primeiras tentativas do TPE são aleatórias. Depois de 40, ele está acima do que a busca aleatória alcança depois de 60.

Define-by-run: o espaço de busca é código


def build(trial):
    family = trial.suggest_categorical('family', ['logistic', 'boosting'])
    if family == 'logistic':
        C = trial.suggest_float('C', 1e-3, 1e2, log=True)
        return make_pipeline(FunctionTransformer(np.log1p), StandardScaler(),
                             LogisticRegression(C=C, max_iter=2000))
    return HistGradientBoostingClassifier(
        learning_rate=trial.suggest_float('learning_rate', 0.01, 0.5, log=True), ...)
  
No kc1 a melhor é uma regressão logística, C ≈ 0,03, 0,798, empatada com o boosting escolhido à mão; o TPE gastou 31 das 40 tentativas nela. Um espaço que deixa de fora o modelo simples nunca vai poder lhe dizer que você não precisava do complicado.
Etapa 4 · por que pagar inteira uma tentativa ruim?

Poda: pare cedo uma tentativa ruim

  • O objetivo informa a média corrente depois de cada fold (trial.report).
  • O podador pela mediana para uma tentativa pior do que a mediana das tentativas anteriores no mesmo fold.
10 de 40
tentativas podadas
171 de 200
folds ajustados: 15% do orçamento economizado
Podar é apostar que uma tentativa que começa mal termina mal. O próximo método faz essa aposta de forma sistemática.

Halving sucessivo: um torneio

Comece \(n = 27\) configurações com um orçamento pequeno; fique com o melhor terço; dê aos sobreviventes 3 × mais; repita.

rodadaconfiguraçõesárvores cadacusto
12710270
2930270
3390270
41270270
total1.080
As 27 com 270 árvores custariam 7.290: o torneio olha 27 configurações pelo preço de 4 completas (Jamieson & Talwalkar, 2016; HalvingRandomSearchCV).

O que o torneio supõe

A ordem depois de um orçamento pequeno prevê a ordem depois do orçamento completo. Dois torneios: orçamento em árvores, orçamento em linhas.

Preveja. Pontue os 27 candidatos com o orçamento completo. Qual torneio escolheu o melhor vencedor?
vencedor, orçamento emescore completoposição
árvores0,78113.º de 27
linhas0,7875.º de 27
melhor com o orçamento completo0,7911.º
As mesmas 27 configurações passadas pelo halving com árvores ou com linhas como orçamento; com árvores, toda taxa de aprendizado pequena é eliminada depois de 10 árvores

Com uma taxa de aprendizado pequena, 10 árvores mal começaram: quem aprende devagar, o melhor com 270 árvores, foi todo eliminado na rodada 1.

Hyperband: vários torneios

Quão agressivo deve ser o torneio? O Hyperband roda brackets de agressividade diferente, cada um custando mais ou menos o mesmo (Li et al., 2018).

bracketrodadas (configurações × orçamento)custo
s = 327 × 1 → 9 × 3 → 3 × 9 → 1 × 27108
s = 212 × 3 → 4 × 9 → 1 × 2799
s = 16 × 9 → 2 × 27108
s = 04 × 27 (busca aleatória pura)108
Se a ordem inicial for confiável, o bracket 3 acha o vencedor barato; se for enganosa, o bracket 0 ainda dá uma chance justa a quem aprende devagar. 423 unidades para 49 configurações.
Etapa 5 · até onde a automação vai e onde ela falha?

AutoML de pipeline completo: o problema CASH

Combined Algorithm Selection and Hyperparameter optimization: seleção do algoritmo e dos hiperparâmetros juntos (Thornton et al., 2013).

sistemacomo buscao que devolve
auto-sklearnotimização bayesiana, com partida a quente a partir de conjuntos de dados parecidosum ensemble (ensemble selection)
TPOTprogramação genética sobre árvores de pipelineo melhor pipeline, como código scikit-learn
AutoGluon-Tabularpouca busca: bagging e empilhamento em várias camadasum ensemble empilhado
FLAMLatenta ao custo: configurações baratas primeiroo melhor modelo único num orçamento de tempo
Duas ideias se repetem: ensembles de modelos bons e diferentes e partidas a quente. Você ainda escreve o rótulo, a métrica, o limite de tempo e, antes de tudo isso, as tabelas de treino e de teste.

Ele otimiza o vazamento que você deu

bug_reports: preenchida depois do lançamento; o modelo precisa apontar módulos arriscados antes do lançamento, quando a contagem é zero para todo mundo.

Preveja. A mesma busca aleatória, com e sem a coluna. Qual modelo é melhor quando for usado de verdade?
ROC AUC
melhor CV, sem a coluna / com ela0,792 / 0,916
teste, vencedor com vazamento, coluna preenchida0,962
teste, vencedor honesto0,804
teste, vencedor com vazamento, como será usado (bug_reports = 0)0,782

Toda verificação automática passa. O vazamento está nos dados: só quem sabe quando cada coluna é registrada consegue pegá-lo.

Uma busca mais longa sobreajusta os dados de validação

Escore de CV da configuração escolhida e escore de teste dela, contra o número de tentativas, com 1.687 e com 300 linhas de desenvolvimento

1.687 linhas, de 10 para 150 tentativas: CV de 0,803 para 0,808, teste de 0,804 para 0,809. Honesto.

300 linhas: CV de 0,772 para 0,788, teste de 0,765 para 0,769. Três quartos do ganho relatado são sorte.

A partir de certo ponto, mais tentativas compram otimismo. Avalie a busca inteira com CV aninhada ou com um conjunto de teste trancado e usado uma só vez.

O resto do trabalho

formular o problema

o que é previsto, para quem, em que momento e quanto custa um erro

escolher a métrica

84,5% dos módulos do kc1 são limpos: uma busca por acurácia aprova um modelo que nunca aponta nada

o desenho da validação

grupos, ordem no tempo e vazamentos são explorados pela busca, não corrigidos

dados e atributos

remover uma coluna vazada mudou a precisão média em 0,18; o ajuste, em 0,007

E a implantação: um ensemble empilhado de 40 modelos pode ser o mais difícil de servir, explicar e retreinar.

Um padrão prático

  1. Tranque um conjunto de teste e fixe um único cv.
  2. Baselines primeiro: um dummy, um modelo linear, um boosting com os valores padrão.
  3. Busca aleatória ou Optuna, de 30 a 100 tentativas, escalas log, o modelo simples no espaço.
  4. Para dados grandes ou modelos lentos: halving ou poda, com uma unidade de orçamento que não interaja com os botões.
  5. Pare quando o melhor escore deixar de se mover mais do que o próprio desvio-padrão entre folds.
  6. Relate o escore de teste trancado ou uma CV aninhada da busca inteira, nunca o melhor escore da própria busca.
Lab · dois a três minutos de execução

Quatro buscas, um orçamento

phoneme: 5.404 vogais, orais ou nasais. Grade, busca aleatória, TPE e halving recebem 27 avaliações cada.

Escolhido (melhor CV): o vencedor do halving, CV 0,9528, teste 0,9455; os valores padrão caem o mesmo tanto (0,9468 → 0,9374).

Busca aleatória: best_score_ 0,9499; estimativa aninhada 0,9472 ± 0,0067.

Rode !pip install optuna antes. Notebook do lab (Jupyter ou Colab, Arquivo → Fazer upload de notebook).

Melhor ROC AUC de CV até aqui no phoneme para grade, busca aleatória, TPE e halving

Resumo

  1. Ajustar é uma caixa-preta cara e ruidosa: o orçamento é o número de chamadas.
  2. Desenhe o espaço: escalas log e botões condicionais.
  3. A busca aleatória vence a grade quando só alguns botões importam.
  4. Otimização bayesiana e TPE aprendem onde olhar; as hipóteses deles importam.
  5. Halving e Hyperband param cedo as configurações ruins, se a ordem inicial estiver certa.
  6. Uma busca otimiza seus vazamentos e a própria sorte: avalie-a em dados intocados.