Ir para o conteúdo

AutoML

A busca em grade funciona, mas é força bruta: o custo se multiplica por hiperparâmetro, a maior parte da grade é desperdiçada em regiões ruins, e alguém ainda precisa escolher a grade. O AutoML automatiza a busca — sobre hiperparâmetros e, no extremo ambicioso, sobre o pipeline inteiro. O objetivo não é substituir o profissional; é gastar seu julgamento com formulação, dados e desenho de validação enquanto a máquina mói o espaço de busca.

Além da grade: busca aleatória

Bergstra & Bengio (2012) fizeram uma observação simples e devastadora: quando apenas alguns hiperparâmetros realmente importam (o caso usual), uma grade desperdiça avaliações — ela retesta os mesmos poucos valores do parâmetro importante enquanto marcha por outros irrelevantes. A amostragem aleatória cobre a faixa de cada dimensão muito melhor com o mesmo orçamento:

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import loguniform, randint

param_dist = {
    'model__learning_rate': loguniform(1e-3, 0.3),   # contínuo, em escala log
    'model__max_depth': randint(2, 10),
    'model__subsample': (0.6, 0.8, 1.0),
}
search = RandomizedSearchCV(pipe, param_dist, n_iter=50, cv=5,
                            scoring='roc_auc', n_jobs=-1, random_state=0)

A busca aleatória é a baseline honesta que todo método mais inteligente precisa superar.

Otimização bayesiana: uma busca que aprende

Cada avaliação de CV é cara — por que ignorar o que os ensaios anteriores revelaram? A otimização bayesiana trata o escore como uma função desconhecida dos hiperparâmetros e itera:

  1. ajustar um modelo substituto (surrogate) barato aos pares (configuração → escore) vistos até agora;
  2. escolher a próxima configuração por uma função de aquisição que equilibra exploração da melhor região conhecida (exploitation) e exploração de regiões incertas (exploration);
  3. avaliar, adicionar ao histórico, repetir.

O Optuna (Akiba et al., 2019) é o favorito do ecossistema (surrogate TPE por padrão), com uma API definitiva — você escreve o espaço de busca como uma função:

import optuna
from sklearn.model_selection import cross_val_score

def objective(trial):
    params = {
        'learning_rate': trial.suggest_float('learning_rate', 1e-3, 0.3, log=True),
        'max_depth': trial.suggest_int('max_depth', 2, 10),
        'subsample': trial.suggest_float('subsample', 0.5, 1.0),
        'reg_lambda': trial.suggest_float('reg_lambda', 1e-3, 10, log=True),
    }
    model = xgb.XGBClassifier(**params, n_estimators=300)
    return cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc').mean()

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
study.best_params

Como o espaço é definido em código, ele pode ser condicional (ajustar gamma apenas se kernel == 'rbf') — impossível de expressar como uma grade.

Halving sucessivo: gaste menos com os perdedores

Truque ortogonal — a maioria das configurações revela sua mediocridade cedo (poucas rodadas de boosting, pequenos subconjuntos de dados). O halving sucessivo explora isso: comece muitas configurações com um orçamento pequeno, mantenha a melhor fração, multiplique seu orçamento, repita — um torneio em que os finalistas recebem treino completo. O Hyperband o envolve com múltiplos níveis de agressividade; os pruners do Optuna fazem o mesmo eliminando ensaios ruins no meio da CV.

from sklearn.experimental import enable_halving_search_cv  # noqa
from sklearn.model_selection import HalvingRandomSearchCV

search = HalvingRandomSearchCV(pipe, param_dist, factor=3,
                               resource='model__n_estimators',
                               max_resources=1000, cv=5)

AutoML de pipeline completo

O escopo mais amplo: buscar sobre imputação × codificação × escalonamento × seleção de atributos × família de modelo × hiperparâmetros × ensembling conjuntamente. Sistemas: auto-sklearn (otimização bayesiana + warm starts por meta-aprendizado + auto-ensembling), TPOT (evolui pipelines por programação genética), FLAML (consciente de custo, frugal), AutoGluon (stacking multicamadas de muitos modelos; frequentemente os resultados tabulares mais fortes), além de plataformas comerciais.

from autogluon.tabular import TabularPredictor
predictor = TabularPredictor(label='churn', eval_metric='roc_auc') \
                .fit(train_df, presets='best_quality', time_limit=3600)

O que o AutoML não consegue fazer

A busca otimiza exatamente o que você mandar. Validação lixo na entrada, modelo lixo na saída — em escala. Ainda são seus:

  • a formulação do problema e a escolha da métrica (otimizar F1 vs revocação@precisão = produtos diferentes);
  • o desenho da validação — vazamento, estrutura de grupos, ordenação temporal: o AutoML explorará alegremente qualquer vazamento com mais força que um humano;
  • qualidade dos dados e atributos — uma hora de engenharia de atributos rotineiramente supera um dia de busca de hiperparâmetros;
  • justiça, explicabilidade e a decisão de colocar em produção.

Padrão prático

Projeto tabular, edição anos 2020: baseline (Dummy + regressão logística) → gradient boosting com padrões → Optuna, ~100 ensaios no booster → considere o AutoGluon se a acurácia valer o processamento. Escale apenas enquanto o escore de validação continuar pagando pelo esforço.


Quiz