Machine Learning · Insper

Seleção de Modelos

Abordagem fundamental

Quando um modelo erra, ele erra por quê — e o que fazer em cada caso

O caminho desta parte

  1. Duas maneiras de errarmuitos ajustes de uma verdade: subajuste e sobreajuste
  2. Decompor o erroviés² + variância + ruído, medidos
  3. Diagnosticar com curvascurva de validação, curva de aprendizado, o diagnóstico
  4. Girar o botãoo botão de complexidade de cada família, depois o lab: diagnosticar e tratar
Cada etapa responde a uma pergunta: de que jeitos um modelo erra? → de onde vem o erro de teste? → viés ou variância, sem conhecer a verdade? → o que mudar para corrigir?
Etapa 1 · De que jeitos um modelo erra?

Um exemplo à mão, em \(x = 0{,}25\)

Cada conjunto de treino ajusta um polinômio e prevê em \(x = 0{,}25\), onde a verdade vale 1. Viés \(= \overline{\hat f} - f(0{,}25)\); variância \(= \tfrac{1}{k}\sum_i (\hat f_i - \overline{\hat f})^2\). Preveja. Qual grau acerta em média, e qual se espalha mais?

Duas maneiras de errar

Vinte ajustes de grau 1, 3 e 12 sobre um seno

Verdade: \(\sin(2\pi x)\). Cada curva é um polinômio ajustado num conjunto de treino diferente de 30 pontos.

Grau 1: todas as retas erram do mesmo jeito. Grau 12: acertam na média, mas cada uma pode estar longe. São as duas falhas: subajuste e sobreajuste.

O alvo: viés e variância

Quatro alvos combinando viés baixo ou alto com variância baixa ou alta
Etapa 2 · De onde vem o erro de teste?

A decomposição

Num \(x\) fixo: a verdade \(f(x)\); uma observação nova \(y = f(x) + \varepsilon\), ruído \(\varepsilon\) de média 0 e variância \(\sigma^2\); a previsão \(\hat f(x)\), aleatória porque depende do conjunto de treino; \(\mathbb{E}\): a média sobre conjuntos de treino e ruído.

\[ \mathbb{E}\big[(y - \hat f(x))^2\big] = \underbrace{\big(f(x) - \mathbb{E}[\hat f(x)]\big)^2}_{\text{viés}^2} + \underbrace{\mathbb{E}\big[(\hat f(x) - \mathbb{E}[\hat f(x)])^2\big]}_{\text{variância}} + \underbrace{\sigma^2}_{\text{ruído}} \]
  1. \(y - \hat f = (f - \hat f) + \varepsilon\); o \(\varepsilon\) novo tem média 0 e é independente do conjunto de treino, então o termo cruzado some: \(\mathbb{E}[(y - \hat f)^2] = \mathbb{E}[(f - \hat f)^2] + \sigma^2\).
  2. Para qualquer \(Z\) aleatório: \(\mathbb{E}[Z^2] = (\mathbb{E}[Z])^2 + \operatorname{Var}(Z)\). Com \(Z = f - \hat f\): viés² + variância.

Viés: a melhor tentativa da família erra em média (uma reta não acompanha um seno). Variância: o preço de dar ouvidos à amostra. Ruído: a parte de \(y\) que não depende de \(x\); aqui \(\sigma^2 = 0{,}3^2 = 0{,}09\) e ninguém fica abaixo disso.

Em \(x = 0{,}25\): grau 1 ≈ 0,307 + 0,017 + 0,09 = 0,414; grau 3 ≈ 0,0036 + 0,0052 + 0,09 = 0,099.

Medido com 500 conjuntos de treino

Preveja. 500 conjuntos de treino de 30 pontos por grau. Em que grau o erro quadrático médio (MSE, do inglês mean squared error) de teste é o menor? E o que acontece com a variância no grau 12?

grauviés²variânciaruídosomaMSE de teste medido
00,4950,0200,090,6050,603
10,2040,0220,090,3160,314
30,0050,0180,090,1130,112
50,0000,0450,090,1350,135
70,0010,6350,090,7260,723
120,00138,8970,0938,98738,985
  • As colunas fecham por construção (a decomposição é uma identidade): a soma bate com o erro medido em dados novos, a menos do ruído novo (diferença ≤ 0,004).
  • O viés cai até zero; a variância sobe devagar e depois com violência. Lida contra o grau, a soma tem forma de U: alta à esquerda (viés), mínima no grau 3, alta à direita (variância). As variâncias grandes são ordens de grandeza: um punhado das 500 amostras produz a maior parte delas.

Três famílias, a mesma forma de U

Viés, variância e soma para polinômios, k-NN e árvore
  • O U é a curva verde, viés² + variância + ruído (o erro de teste esperado), contra a complexidade, que cresce para a direita (eixo vertical em escala log). Ela desce enquanto o viés cai mais rápido do que a variância sobe e volta a subir quando a variância domina. Fundos: grau 3 (0,113), \(k = 3\) (0,142) e profundidade 3 (0,166); o U da árvore é raso.
  • O k-vizinhos mais próximos (k-NN, do inglês k-Nearest Neighbors) com \(k = 30\) (todos os pontos) é o polinômio de grau 0; no k-NN, \(k\) pequeno é o modelo complexo.
  • O 1-NN copia um rótulo ruidoso: variância ≈ \(\sigma^2\) (a variância do ruído, 0,09), erro de teste ≈ \(2\sigma^2\) (medido: 0,195).

Simulador: subajuste ↔ sobreajuste, ao vivo

Preveja. Deslize o grau de 0 (puro viés) a 12 (pura variância). Qual erro só cai e qual volta a subir?

Etapa 3 · Viés ou variância, sem conhecer a verdade?

Curva de validação: o U sem conhecer a verdade

MSE de treino e de validação por grau em 30 pontos
  • Treino só desce: 0,267 → 0,046. Escolher por ele dá sempre o mais complexo.
  • À esquerda: os dois altos e próximos — viés.
  • À direita: treino cai, validação sobe até 1,748 — variância.
  • Fundo no grau 3 (0,114): o mesmo da simulação com 500 amostras.
Uma curva de validação varia a complexidade com os dados fixos.

Curva de aprendizado: mais dados valem a pena?

Preveja. Cada vez mais pontos de treino: o erro do grau 1 continua caindo? E o do grau 9?

Curvas de aprendizado de grau 1 e grau 9
  • Mediana de 300 conjuntos de treino por tamanho.
  • Grau 1: treino e teste se encontram perto de 0,29 e ficam lá. Mais dados não ajudam.
  • Grau 9: erro de teste 5,6 com 12 pontos, no piso de ruído por volta de 200. Com os coeficientes fixos, os dados fecham a distância.
Uma curva de aprendizado varia os dados com o modelo fixo. "Complexo demais" é relativo à quantidade de dados.

O diagnóstico

Fluxograma do diagnóstico viés ou variância

Quatro ferramentas que se confundem

O que separa cada uma é o que se varia e o que fica fixo.

o que se variao que fica fixoprecisa da verdade?
decomposição viés–variânciao conjunto de treino (500 amostras)o modelosim
curva de validaçãoa complexidadeos dadosnão
curva de aprendizadoo número de linhas de treinoo modelonão
busca em gradecombinações de hiperparâmetrosos dados e o cvnão
A curva de validação desenha para diagnosticar; a busca em grade faz a mesma conta e escolhe. Só a decomposição separa viés e variância, e ela exige conhecer a verdade.
Etapa 4 · O que mudar para corrigir?

Toda família tem um botão

Um botão é o hiperparâmetro que leva o modelo pelo eixo de complexidade do U: para a esquerda, mais viés (subajuste); para a direita, mais variância (sobreajuste). Viés alto pede girar para a direita; variância alta, para a esquerda. Preveja. Para deixar cada modelo mais complexo, para que lado você gira cada botão?

famíliabotãomais complexo
(→ variância)
mais simples
(→ viés)
polinômiodegree (grau)maiormenor
Ridge, Lassoalpha (força da penalidade)menormaior
regressão logísticaC (inverso da penalidade)maiormenor
k-NNn_neighbors (\(k\), vizinhos que votam)menormaior
árvoremax_depth (profundidade)maiormenor
árvoremin_samples_leaf (linhas mínimas por folha)menormaior
Três giram "ao contrário": em alpha, n_neighbors e min_samples_leaf, maior é mais simples: mais penalidade, mais vizinhos na média, folhas maiores.

GridSearchCV: a curva de validação que escolhe sozinha


from sklearn.model_selection import GridSearchCV, RepeatedKFold

# 1. o modelo, com o botão ainda solto
modelo = make_pipeline(PolynomialFeatures(), StandardScaler(),
                       LinearRegression())

# 2. os valores do botão a experimentar
#    (nome do passo + __ + hiperparâmetro)
grade = {"polynomialfeatures__degree": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}

# 3. como medir cada valor: 5 folds × 20 repetições (o cv do slide 10)
cv = RepeatedKFold(n_splits=5, n_repeats=20, random_state=0)
busca = GridSearchCV(modelo, grade, cv=cv,
                     scoring="neg_mean_squared_error")

# 4. mede os 10 graus, escolhe o menor erro
#    e reajusta o vencedor nas 30 linhas
busca.fit(X, y)
busca.best_params_       # {'polynomialfeatures__degree': 3}
    

O que a busca mediu (busca.cv_results_):

grauMSE de validação
10,319
20,386
30,114
40,311
50,198
60,255
70,579
80,424
91,748
101,222
É a curva azul do slide 10 em forma de tabela: a busca só pega a linha de menor erro e busca.predict passa a usar o grau 3. O MSE entra negativo (neg_mean_squared_error) porque o scikit-learn sempre maximiza.

Resumo

  1. Erro de teste = viés² + variância + ruído. O ruído é um piso.
  2. Viés: treino ≈ validação, ambos altos. Variância: treino ≪ validação.
  3. Curva de validação varia a complexidade; curva de aprendizado varia os dados.
  4. Num modelo de capacidade fixa, mais dados curam a variância e não o viés; mais capacidade só cura viés.
  5. Todo modelo tem um botão de complexidade e alguns giram ao contrário.

Os padrões típicos

Nas curvas de erro de treino e de validação (aqui, baixo é bom):

o que você vêdiagnósticoação
treino ≈ validação, ambos altos, curvas planasviésajustar o modelo (mais capacidade)
treino baixo, validação alta, distância fechandovariânciamais dados
treino baixo, validação alta, distância paradavariânciaregularizar ou simplificar
treino alto e distância grandeos doisprimeiro capacidade, depois rever
ambos baixos, juntosokpare (talvez seja o piso de ruído)

"Alto" é relativo: sem conhecer o \(\sigma^2\) (a variância do ruído), compare com um baseline (prever a média, um modelo simples) ou com o erro aceitável para o negócio.

A curva de aprendizado diz se vale buscar dados; a curva de validação diz para onde girar o botão. O fluxo: a de validação acha a complexidade e depois a de aprendizado, nesse ponto, decide sobre os dados.
Lab fundamental · cerca de 40 min, em duplas

Preços de casas: diagnosticar e tratar, passos 1 a 6

  • California housing: 20.640 distritos, 9 atributos, alvo = valor mediano das casas.
  • Três famílias (linear, k-NN, árvore): qual sofre de viés e qual de variância? Mais dados ajudariam? Qual botão girar?
  • Notebook no Colab: nada para baixar. Salve uma cópia no seu Drive.
  • Em cada passo, responda o Preveja antes de rodar.
  • Simulações: a variância, vista de perto (passo 3) e o alpha como botão contínuo (passo 6).

Ritmo: passos 1 a 3 e a primeira simulação em 15 min; passos 4 a 6 e a segunda em 25 min.