Machine Learning · Insper

Pré-processamento de Dados

Abordagem avançada

O que as receitas simples deixam passar e como escolher entre as alternativas

O caminho desta parte

  1. Escalonar para o gradientea curvatura da perda; uma só taxa de aprendizado
  2. Escolher a potênciaBox-Cox, Yeo-Johnson, quantis
  3. Codificar para o modeloa coluna descartada; centenas de níveis; target encoding
  4. Imputar pelas outras colunasKNNImputer, IterativeImputer; conferir os valores
  5. Montar a receitao mapa, coluna a coluna
Cada etapa responde a uma pergunta: por que o gradiente descendente quer atributos escalonados? → que potência uma coluna assimétrica pede? → do que cada modelo precisa numa categoria? → as outras colunas preenchem um buraco? → que receita cada coluna recebe?
Etapa 1 · por que o gradiente descendente quer atributos escalonados?

Um vale comprido ou uma tigela redonda

idade e tarifa brutas razão de curvaturas 13,4 padronizadas: razão 1,2

Com perda quadrática, a curvatura em cada direção é dada pela variância dos atributos: os autovalores de \(M^\top M / n\), com \(M\) a matriz centrada (idade, tarifa) de \(n\) linhas.

bruta208,62; 2798,59razão 13,4
padronizada0,9; 1,1razão 1,2

Uma taxa de aprendizado segura na direção íngreme se arrasta na direção plana.

Padronizada, a tigela fica quase redonda: o gradiente descendente pode usar uma só taxa de aprendizado para todos os pesos (a aula de gradiente descendente).
Etapa 2 · que potência uma coluna assimétrica pede?

Deixe os dados escolherem a potência

Assimetria de Fare: 4,79 bruta, 0,39 após log1p, −0,04 após Yeo-Johnson, −0,94 após QuantileTransformer

Box-Cox

\(x' = (x^\lambda - 1)/\lambda\), com \(\lambda = 0\) significando \(\log x\); \(\lambda\) por máxima verossimilhança. Exige \(x > 0\): recusa os 15 bilhetes gratuitos.

Yeo-Johnson

aceita zero e negativos. \(\lambda = -0{,}098\), perto de um log → assimetria −0,04.

QuantileTransformer

troca cada valor pelo seu posto → −0,94; os 15 bilhetes gratuitos se empilham em −5,20.

\(\lambda\) e os quantis são aprendidos: ajuste no treino. O PowerTransformer padroniza a saída por padrão (forma, depois escala). Os quantis guardam só a ordem.
Etapa 3 · do que cada modelo precisa numa categoria?

One-hot e o intercepto: a coluna descartada

portointerceptoCQSC + Q + S
S10011
C11001
S10011
Q10101
S10011
C11001

As três colunas de porto sempre somam a coluna do intercepto: posto 3 para 4 colunas.

Os pesos não são únicos: somar 5 aos três pesos de porto e subtrair 5 do intercepto dá as mesmas previsões.

drop='first' remove C, a referência: posto 3 para 3 colunas; cada coeficiente se lê "em comparação com Cherbourg".

drop='first' para modelos lineares com intercepto e sem penalidade. Mantenha todas as colunas para árvores, k-NN (k vizinhos mais próximos) e modelos regularizados: para uma distância, "referência" e "desconhecida" seriam ambas 0 0.

Alta cardinalidade e target encoding

Ticket tem 681 valores distintos para 891 linhas: o one-hot criaria 681 colunas quase só de zeros, sobreajuste garantido.

  • Primeiro procure a estrutura escondida: a letra do deck em Cabin, o título em Name (Mr, Miss, Mrs, Master...).
  • Depois agrupe os níveis raros: min_frequency=10 mantém 4 títulos e junta os outros 13.
  • Target encoding: trocar cada categoria pela média do alvo naquela categoria. Uma coluna só, qualquer que seja a cardinalidade.
Preveja. Uma coluna sem informação nenhuma: 2.000 passageiros, 800 bilhetes aleatórios, sobrevivência no cara ou coroa. Codifique pela média por bilhete e aplique "sobreviveu se passar de 0,5". Que acurácia de treino você espera?

O target encoding vaza

codificação de puro ruídotreinoteste
média ingênua por categoria0,7750,505
TargetEncoder (com cross-fitting)0,4960,505
  • A maioria dos bilhetes aparece uma ou duas vezes, então o valor codificado de uma linha é, em boa parte, o próprio rótulo dela: o modelo aprende a ler a resposta, não a prevê-la.
  • Cross-fitting: o fit_transform codifica cada fold com médias dos outros folds, de modo que nenhuma linha vê o próprio rótulo; as categorias raras são puxadas para a média global.
Nunca calcule um target encoding em linhas em que você avalia: fit_transform no treino, transform no teste. Opções sem o alvo: codificação por frequência, hashing.
Etapa 4 · as outras colunas preenchem um buraco?

KNNImputer, à mão

Mr. James Moran pagou £8,46 e não tem idade. O imputador procura os \(k = 2\) passageiros de tarifa mais próxima e tira a média das idades deles.

passageiroidadetarifa|tarifa − 8,46|
326£7,930,5
122£7,251,2
435£53,1044,6
238£71,2862,8
Idade imputada \((26 + 22)/2 = \mathbf{24}\). O imputador pela média ignora a tarifa e responde 30,25. Com várias colunas, a distância precisa de escalas comparáveis, exatamente como no k-NN.

Imputar a partir das outras colunas

Desvio padrão de Age: 14,53 observado, 13,00 pela média, 13,29 com KNN, 13,60 iterativo com 7 idades negativas

KNNImputer

média das \(k\) linhas mais parecidas. Com classe, irmãos e pais: desvio 13,29, nenhuma idade impossível.

IterativeImputer

uma regressão de cada coluna sobre as outras, em ciclos (MICE, imputação múltipla por equações encadeadas). Produziu 7 idades negativas: não sabe que idade é positiva.

Os dois espalham os palpites (13,29 e 13,60 contra 13,00 da média), mas nenhum recupera 14,53. Confira os valores imputados.
Etapa 5 · que receita cada coluna recebe?

O mapa do pré-processamento

Por coluna: ausentes → forma → escala, toda etapa ajustada nas linhas de treino. Clique nas respostas para montar a receita.

Quais famílias se importam com qual etapa

família de modelosescalaformacodificaçãovalores faltantes
k-NN, k-means, SVM, PCAobrigatóriaajudaone-hotprecisam ser imputados
regressão linear/logística, redes neuraisobrigatóriaajudaone-hot, drop='first' sem penalidadeprecisam ser imputados
árvores, florestas aleatórias, gradient boostingdesnecessáriadesnecessáriacódigos ordinais servemas árvores do scikit-learn aceitam NaN

SVM: máquina de vetores de suporte; PCA: análise de componentes principais; NaN: not a number, o valor ausente.

Um log aplicado depois de escalonar desfaria o escalonamento (e falharia nos valores negativos): forma antes da escala.

Resumo

  1. Escalonar também deixa a perda redonda: uma só taxa de aprendizado para todos os pesos.
  2. Deixe os dados escolherem a potência: o Yeo-Johnson aceita zeros; \(\lambda\) se aprende no treino.
  3. drop='first' só para modelos lineares com intercepto e sem penalidade.
  4. Centenas de níveis: estrutura, níveis raros agrupados, target encoding com cross-fitting.
  5. Imputadores que usam as outras colunas espalham os palpites; confira o que eles inventam.
A seguir: Pipelines, que tornam o "ajuste no treino, transforme o resto" impossível de quebrar por descuido.
Lab avançado · cerca de 25 min, em duplas

Um único objeto, um modelo caixa-preta e imputadores mais espertos: passos 7 a 9

  • Passo 7: toda estatística num único ColumnTransformer: 12 colunas, nenhum NaN, nenhum texto.
  • Passo 8: um k-NN usado como caixa-preta, com e sem escalonamento. Passo 9: imputadores que usam as outras colunas.
  • Continue no notebook do lab, na mesma sessão.
  • Simulações: forma antes da escala (passo 8) e um imputador mais esperto dentro do pipeline (passo 9).
Preveja. O baseline "sempre não sobreviveu" acerta 61,5%. Um k-NN caixa-preta com e sem escalonamento, mesmos dados: qual a distância entre os dois?

Ritmo: passo 7 em 5 min; passo 8 e a primeira simulação em 10 min; passo 9 e a segunda em 10 min.