Machine Learning · Insper

Pré-processamento de Dados

Abordagem fundamental

Como colunas brutas viram números que um modelo usa sem ser enganado

O algoritmo só enxerga números

Ele minimiza o custo com os números que você entregou. Se estiverem mal preparados, minimiza a coisa errada, com toda a convicção.

escalas incompatíveis

a coluna com os maiores números domina distâncias e penalidades

Fare vai de 0 a 512, SibSp de 0 a 8

texto

não existe aritmética com "female"

Sex, Embarked, Cabin, Ticket, Name

buracos

a maioria das implementações recusa NaN (not a number, o valor ausente)

Age falta em 19,9%, Cabin em 77,1%

Cada etapa é medida em poucos números que dá para conferir na calculadora e depois no Titanic (891 passageiros da viagem de 1912). A EDA (análise exploratória de dados) olhava a tabela; esta aula a muda.

Cada etapa aprende algo (uma média, uma mediana, uma lista de categorias) e precisa aprender só com as linhas de treino.

O caminho desta parte

  1. Escalonara unidade decide a distância; quatro escalonadores
  2. Ajustar só no treinofit uma vez nas linhas de treino, transform no resto
  3. Corrigir a formaassimetria; um log, não um escalonador
  4. Codificar categoriasordinal, one-hot, categorias inéditas
  5. Imputar faltantespor que falta; um valor; uma flag
Cada etapa responde a uma pergunta: qual coluna manda na distância? → de onde um passo pode aprender seus números? → o que um escalonador não conserta? → como uma categoria vira número? → o que pôr nos buracos?
Etapa 1 · qual coluna manda na distância?

Três passageiros, à mão

passageiroidadetarifa
ABraund, Mr. Owen Harris (3ª classe)22,0£7,25
BConnors, Mr. Patrick70,5£7,75
CPears, Mrs. Thomas (1ª classe)22,0£66,60
Preveja. Com a distância euclidiana em (idade, tarifa), qual passageiro está mais perto de A: o senhor de 70 anos (B) ou a jovem de 22 (C)?

Em unidades brutas, o senhor de 70 anos ganha

pardiferença de idadediferença de tarifadistância
A–B48,5 anos£0,50\(\sqrt{48{,}5^2 + 0{,}5^2} = 48{,}50\)
A–C0 anos£59,35\(\sqrt{0^2 + 59{,}35^2} = 59{,}35\)

48,5 anos é um número menor que 59,35 libras. Nada diz que um ano e uma libra deveriam pesar o mesmo: é só o que acontece quando se subtraem números brutos.

Preveja. Agora meça cada coluna em desvios padrão, \(z = (x - \mu)/\sigma\), com \(\mu\) a média da coluna e \(\sigma\) o desvio padrão dela: \(\sigma_{\text{Age}} = 14{,}52\), \(\sigma_{\text{Fare}} = 52{,}88\). A resposta muda?

Padronizado, a ordem se inverte

Em unidades brutas, B é o mais próximo de A; padronizado, C é o mais próximo

A–B: \(48{,}5 / 14{,}52 = \mathbf{3{,}34}\) desvios

A–C: \(59{,}35 / 52{,}88 = \mathbf{1{,}12}\) desvio

\(\mu\) e \(\sigma\) calculados sobre os 714 passageiros com idade conhecida.

Nenhuma das duas é "a verdadeira": a bruta é um acidente das unidades; a padronizada é uma escolha que dá a cada coluna o mesmo peso.

Simulador: a unidade decide os vizinhos

Preveja. Deslize a unidade da renda de milhares para centavos. Os 5 vizinhos mais próximos do ponto vermelho continuam os mesmos? Depois aperte padronizar.

Qual coluna manda na distância?

Para duas linhas sorteadas, a diferença ao quadrado esperada numa coluna é o dobro da variância dela: a fatia de cada coluna na distância é a fatia dela na variância total. Titanic, quatro colunas numéricas:

colunabrutapadronizada
Fare92,9%
25%
Age7,0%
25%
SibSp0,0%25%
Parch0,0%25%
Um k-NN (k vizinhos mais próximos) nas colunas brutas é, na prática, um k-NN na tarifa. Padronizada, toda coluna tem variância 1 e cada uma fica com 25%.

Quais modelos se importam com a escala

se importam

  • baseados em distância: k-NN, k-means, SVMs (máquinas de vetores de suporte) com kernel
  • baseados em variância: a PCA (análise de componentes principais); o atributo de maior escala vence por padrão
  • treinados por gradiente e penalizados: regressão linear e logística, redes neurais, Ridge/Lasso

não se importam

Árvores, florestas aleatórias, gradient boosting: cortam um atributo de cada vez ("Age < 12?").

Qualquer transformação crescente move o limiar, mas manda as mesmas linhas para cada lado.

Quatro escalonadores: \(x' = (x - \text{centro}) / \text{espalhamento}\)

escalonadorfórmulacentroespalhamentoresultado
StandardScaler\((x - \mu) / \sigma\)médiadesvio padrãomédia 0, desvio 1
MinMaxScaler\((x - x_{\min}) / (x_{\max} - x_{\min})\)mínimoamplitudevalores em \([0, 1]\)
RobustScaler\((x - \text{mediana}) / \text{IQR}\)medianaIQR \(= Q_3 - Q_1\)mediana 0, IQR 1
MaxAbsScaler\(x / \max \lvert x \rvert\)nenhum (0 continua 0)maior \(\lvert x \rvert\)valores em \([-1, 1]\)
Um escalonador é uma transformação linear aplicada a cada coluna separadamente. Os quatro diferem só nas estatísticas que usam. IQR: intervalo interquartil (interquartile range), entre o primeiro quartil \(Q_1\) e o terceiro \(Q_3\).

Quatro escalonadores, passo a passo

Cinco rendas familiares, em milhares de R$: 1, 2, 3, 4 e 40. Preveja. Qual escalonador vai manter as quatro famílias comuns mais espalhadas e qual vai espremê-las?

Mesma geometria, peso diferente ao lado das outras colunas

Num eixo comum, as quatro rendas comuns ocupam 0,2, 0,077, 0,075 e 1,5; o outlier robusto cai em 18,5

Dentro da coluna, as famílias comuns sempre ocupam os mesmos 8% da amplitude: uma transformação linear não muda proporções. O que muda é o tamanho das diferenças entre elas comparado com as outras colunas; é isso que uma distância soma.

No MinMaxScaler, ao lado de uma coluna de idade com desvio 1, duas famílias comuns parecem quase idênticas em renda e a idade decide tudo.

Escolhendo um escalonador

escalonadorefeito dos outliersuso típico
StandardScalermoderado: eles inflam \(\sigma\)o padrão: modelos lineares, SVM, PCA, redes neurais
MinMaxScalerforte: um valor extremo comprime todo o restoquando é preciso um intervalo fixo (pixels)
RobustScalerfraco: eles apenas ficam longecolunas com outliers que você decidiu manter
MaxAbsScalerforte, como o min-maxdados esparsos: zeros continuam zeros
  • Normalização é ambíguo (min-max? "deixar com cara de normal"? o Normalizer do scikit-learn reescala cada linha). Escreva a fórmula.
  • Um valor novo fora da amplitude do treino sai do intervalo: uma renda de 80 vira \((80-1)/39 = 2{,}03\) no min-max.
Etapa 2 · de onde um passo pode aprender seus números?

Ajuste no treino, transforme todo o resto

Uma média ou um desvio padrão é parâmetro do modelo tanto quanto um peso.

fit

aprende as estatísticas e as guarda (mean_, scale_)

transform

aplica as estatísticas guardadas, congeladas

fit_transform

os dois, nos mesmos dados

fit uma vez, nas linhas de treino. Validação, teste e produção só veem transform. A mesma regra vale para toda etapa desta aula: escalonadores, codificadores, imputadores.

Quatro jeitos de chamar o escalonador, passo a passo

Idades de treino 20, 25, 30, 35, 40; passageiros novos de 60 e 70 anos. Preveja. Se alguém chamar StandardScaler().fit_transform(test) nas duas linhas novas, que valores recebem 60 e 70?

Etapa 3 · o que um escalonador não conserta?

Atributos assimétricos: o escalonador não muda a forma

Tarifas do Titanic: metade custou menos de £14,46, três custaram £512 e 15 bilhetes foram gratuitos. Assimetria \(= \frac{1}{n}\sum z_i^3\), a média dos z-scores ao cubo dos \(n\) valores: 0 se simétrica, positiva com cauda longa à direita.

Preveja. A tarifa bruta tem assimetria 4,79. Quanto vale depois do StandardScaler?
tarifaassimetria
bruta4,79
padronizada4,79
raiz quadrada2,09
\(\log(1 + x)\), np.log1p0,39

É preciso uma transformação não linear. O log transforma multiplicações em somas (£8 → £80 e £50 → £500 viram passos iguais); log1p porque \(\log 0 = -\infty\). Ordem: forma, depois escala; confira a assimetria depois.

Etapa 4 · como uma categoria vira número?

Codificação: três tipos de categoria

nominal

sem ordem: porto, cor, cidade

→ one-hot

ordinal

com ordem real: classe do bilhete, escolaridade, tamanho P < M < G

→ inteiros nessa ordem

binária

duas categorias: Sex

→ uma coluna 0/1

O atalho tentador: o OrdinalEncoder numera os portos em ordem alfabética, Cherbourg = 0, Queenstown = 1, Southampton = 2.

Códigos ou one-hot, linha a linha

Os três portos, codificados duas vezes. Preveja. Com códigos inteiros, que dois portos uma distância põe mais longe um do outro? E com one-hot?

Uma inclinação não cabe em dois degraus

sobrevivência por porto

C (código 0)0,554
Q (código 1)0,390
S (código 2)0,337

Degraus de 16,4 e 5,3 pontos. Um modelo linear dá à coluna de códigos um único coeficiente; os dois degraus são obrigados a ser iguais.

o que fazer

O one-hot dá a cada porto o seu coeficiente; nenhum alfabeto decide a ordem.

Árvores são a exceção: cortes em 0,5 e 1,5 isolam cada código, então inteiros servem para elas.

Ordinal: você declara a ordem


OrdinalEncoder().fit(levels).categories_
# ['bachelor', 'high school', 'master']   ordem alfabética!
OrdinalEncoder(categories=[['high school', 'bachelor', 'master']])
# agora os códigos seguem a ordem real: 0, 1, 2
  

O alfabeto põe high school (ensino médio) entre bachelor (graduação) e master (mestrado).

O Pclass já vem como 1, 2, 3. Ordinal (uma coluna) ou nominal (três colunas one-hot) é uma escolha de modelagem: a ordinal supõe que ir da 1ª para a 2ª importa tanto quanto ir da 2ª para a 3ª.

One-hot: uma categoria que o treino nunca viu

Treinado nos portos S, C, S, Q, S, C. Chegam dois passageiros novos: um de Q, outro de Belfast (B).

porto novoEmbarked_CEmbarked_QEmbarked_Spadrão
Q010tudo certo
B000ValueError: a previsão cai
Com handle_unknown='ignore', B vira 0 0 0, "nenhuma das categorias que conheço". É comum na prática: uma categoria rara pode simplesmente não cair na divisão de treino.
Etapa 5 · o que pôr nos buracos?

Valores faltantes: por que falta?

mecanismoo que significaexemplo no Titanic
MCAR, ausência completamente aleatória (missing completely at random)não depende de nadaos 2 Embarked faltantes, plausivelmente
MAR, ausência aleatória condicional (missing at random)depende de outras colunas observadasAge, que falta mais na 3ª classe
MNAR, ausência não aleatória (missing not at random)depende do próprio valor que faltaCabin: sem cabine própria

Age faltante, por classe

1ª 13,9% · 2ª 6,0% · 3ª 27,7%

sobrevivência

idade registrada 40,6% · idade faltante 29,4%

O dropna() custaria 177 linhas (19,9%), concentradas na 3ª classe: os passageiros que mais morreram ficariam sub-representados.

Imputação pela média, passo a passo

Seis valores, dois faltando: 2, 4, ?, 6, ?, 8. Preveja. Depois de preencher os dois buracos com a média, a variância sobe, fica em 5 ou cai?

Guarde o fato de que faltava


imp = SimpleImputer(strategy='median', add_indicator=True)
imp.get_feature_names_out()   # ['Age' 'missingindicator_Age']
# passageiro 1: [22, 0]    passageiro 6: [28, 1]
  

A idade faltante anda junto com menor sobrevivência (29,4% contra 40,6%). A flag custa uma coluna e deixa o modelo decidir se a ausência informa algo. Para categorias: uma categoria própria, 'unknown'.

Nunca impute o alvo. Linhas com alvo faltante saem do treino supervisionado; inventar rótulos fabrica um sinal que não existe.

Resumo

  1. Unidades brutas decidem distâncias por acidente: escalone o que distâncias, variâncias e penalidades usam.
  2. Escalonadores diferem no centro e no espalhamento; um outlier define a escala de todos menos o RobustScaler.
  3. Ajuste no treino, transforme todo o resto.
  4. Um escalonador não conserta a forma: log1p, depois escala.
  5. One-hot para nominais, ordem declarada para ordinais; handle_unknown='ignore'.
  6. Pergunte por que falta; preencher encolhe o espalhamento; guarde uma flag.
sintomao que fazer
uma coluna decide todos os vizinhospadronizar as colunas numéricas
colunas de teste escalonadas com média exatamente 0o escalonador viu o teste: ajustar só no treino
Lab fundamental · cerca de 30 min, em duplas

Preparando o Titanic, coluna por coluna: passos 1 a 6

  • Inventário, dividir primeiro (712 de treino, 179 de teste), por que falta Age, imputá-la, one-hot de Sex, Embarked e Pclass, escalonar os números.
  • Notebook do lab: abra no Jupyter ou no Colab (Arquivo → Fazer upload de notebook).
  • Em cada passo, responda o Preveja antes de rodar.
  • Simulações: a lei do encolhimento, em buracos que você faz (passo 4) e de quem são os vizinhos? (passo 6).

Ritmo: passos 1 a 3 em 8 min; passo 4 e a primeira simulação em 10 min; passos 5 e 6 e a segunda em 12 min.