Escalonamento de Features
O que é escalonamento de atributos?
Escalonamento de atributos (feature scaling) é uma etapa de pré-processamento (preprocessing) que transforma atributos (features) de entrada numéricos para que tenham faixas ou distribuições comparáveis. O objetivo não é “melhorar” os dados em um sentido absoluto, mas fazer com que os algoritmos de aprendizado se comportem bem quando diferentes atributos usam unidades diferentes (por exemplo, dólares vs. anos vs. pixels).
Muitos métodos de aprendizado de máquina (machine learning) assumem implicitamente que cada atributo contribui em uma escala semelhante. Quando essa suposição é violada, os modelos podem ficar:
- Enviesados em favor de atributos de grande magnitude (mesmo que esses atributos não sejam mais informativos)
- Lentos ou instáveis para otimizar
- Numericamente mal condicionados (ill-conditioned) (levando a convergência ruim ou problemas de precisão)
O escalonamento de atributos é uma parte central de fluxos de trabalho práticos de aprendizado de máquina e costuma ser combinado com outros pré-processamentos como Imputação (Tratamento de Valores Ausentes) e Codificação One-Hot dentro de encadeamentos (pipelines) ponta a ponta como Pipelines (Pré-processamento de Aprendizado de Máquina + Modelagem).
Por que o escalonamento importa
1) Modelos baseados em distância (distance-based models) são dominados por atributos em grande escala
Qualquer método que usa distâncias ou similaridades entre amostras é sensível à escala dos atributos.
Exemplos incluem:
- K-Vizinhos Mais Próximos (K-Nearest Neighbors, KNN)
- Agrupamento k-means (K-Means Clustering)
- Métodos de kernel (kernel methods) como Máquinas de Vetores de Suporte (Support Vector Machines, SVMs) com kernel RBF (RBF kernel)
Se você calcula a distância euclidiana (Euclidean distance) entre dois pontos (x) e (y),
[ d(x, y) = \sqrt{\sum_{j=1}^p (x_j - y_j)^2} ]
um atributo com uma faixa de 0–100000 tipicamente dominará um atributo com uma faixa de 0–1, independentemente de qual seja mais preditivo.
Exemplo prático
Suponha que você preveja churn de clientes usando:
age(0–100)annual_income(0–200000)
Sem escalonamento, annual_income influenciará fortemente as distâncias em KNN e no agrupamento.
2) Otimização baseada em gradiente (gradient-based optimization) converge mais rápido e de forma mais confiável
Muitos modelos são treinados minimizando uma função de perda (loss function) usando variantes de Descida do Gradiente (Gradient Descent), incluindo:
- Regressão linear/logística (especialmente com regularização)
- Redes Neurais
O escalonamento afeta a geometria do problema de otimização. Se um atributo tem variância muito maior do que os outros, a superfície de perda fica “esticada”, e a descida do gradiente pode oscilar ou dar passos muito pequenos.
Uma intuição comum: o escalonamento torna os contornos da perda mais esféricos, melhorando a eficiência dos passos e reduzindo a sensibilidade à taxa de aprendizado (learning rate).
3) Regularização (regularization) depende da escala dos atributos
A regularização L1/L2 penaliza o tamanho dos coeficientes. Se os atributos não forem escalonados, a penalização não é “justa”:
- Um atributo medido em unidades grandes pode precisar de um coeficiente minúsculo para ter efeito.
- Um atributo medido em unidades pequenas pode precisar de um coeficiente grande.
- A regularização reduzirá os coeficientes de forma desproporcional dependendo do escalonamento dos atributos, não apenas do valor preditivo.
Isso afeta diretamente modelos com penalidades como Ridge/Lasso/Elastic Net (veja Regularização).
4) PCA e outros métodos baseados em variância exigem escalonamento
Métodos que dependem de variância, covariância ou produto escalar (dot products)—como Análise de Componentes Principais (Principal Component Analysis, PCA)—são sensíveis à escala.
A Análise de Componentes Principais encontra direções de variância máxima. Se um atributo tem variância muito maior simplesmente por causa das unidades, ele dominará os componentes principais.
5) Estabilidade numérica e reprodutibilidade
O escalonamento pode melhorar:
- Estabilidade de ponto flutuante (floating-point) (especialmente quando os valores são muito grandes ou muito pequenos)
- Condicionamento (conditioning) de operações de álgebra linear (por exemplo, inversão de matrizes/solvers)
- Reprodutibilidade entre hardwares ou frameworks
Quando o escalonamento é menos importante (ou desnecessário)
Algumas famílias de modelos são em grande parte invariantes à escala:
- Árvores de decisão e muitos ensembles de árvores (Florestas Aleatórias (Random Forests), Árvores com Aumento de Gradiente (Gradient Boosted Trees)) dividem por limiares e, em geral, não são afetados por escalonamento monotônico.
- Variantes de Bayes ingênuo (Naive Bayes) muitas vezes não são sensíveis da mesma forma (embora Naive Bayes Gaussiano (Gaussian NB) ainda modele variâncias explicitamente).
Mesmo que o modelo “não precise”, o escalonamento ainda pode ajudar com:
- Combinar múltiplos tipos de modelo em um encadeamento
- Componentes posteriores como a Análise de Componentes Principais (PCA)
- Melhorar a consistência de interpretabilidade entre atributos
Métodos comuns de escalonamento de atributos
Padronização (standardization / z-scoring)
Padronização (standardization) transforma cada atributo para ter média zero e variância unitária:
[ x' = \frac{x - \mu}{\sigma} ]
onde (\mu) e (\sigma) são calculados nos dados de treinamento.
- Faixa de saída: ilimitada
- Torna os atributos comparáveis em termos de desvios padrão
- Padrão muito comum para modelos lineares, SVMs e redes neurais
Veja também: Padronização (Pontuação Z)
Quando usar
- Os atributos são aproximadamente em forma de sino (bell-shaped) / contínuos
- Você quer um padrão forte de uso geral
- Você está usando modelos baseados em gradiente ou regularizados
Ressalva
- Sensível a valores atípicos (outliers) porque média e desvio padrão são sensíveis.
Escalonamento min–max (min–max scaling) (reamostragem para uma faixa)
O escalonamento min–max mapeia um atributo para uma faixa fixa, comumente ([0,1]):
[ x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} ]
- Faixa de saída: limitada (tipicamente 0–1)
- Preserva a ordenação relativa e as distâncias relativas dentro do min/max original
Quando usar
- As entradas são naturalmente limitadas (por exemplo, intensidades de pixel)
- Você quer uma faixa fixa de entrada (às vezes útil em redes neurais)
- Você interpreta atributos como proporções dentro de uma faixa
Ressalva
- Muito sensível a valores atípicos: um único valor extremo define a escala e comprime o restante.
Escalonamento robusto (robust scaling) (mediana e IQR)
O escalonamento robusto usa a mediana e o intervalo interquartil (IQR, interquartile range):
[ x' = \frac{x - \text{median}(x)}{\text{IQR}(x)} \quad\text{where}\quad \text{IQR} = Q_3 - Q_1 ]
- Menos sensível a valores atípicos do que padronização ou min–max
- Útil para distribuições com caudas pesadas (heavy-tailed) (por exemplo, renda)
Quando usar
- Os dados têm muitos valores atípicos ou caudas pesadas
- Você quer comparabilidade de escala sem deixar extremos dominarem
Ressalva
- Ainda não “corrige” distribuições assimétricas (skewed); apenas reduz a influência de outliers.
Normalização (normalization) (escalonamento para norma unitária)
Normalização (em muitas bibliotecas de aprendizado de máquina) significa escalonar cada vetor de amostra para ter norma unitária, por exemplo L2:
[ x' = \frac{x}{|x|_2} ]
- Atua por linha/amostra, não por atributo
- Comum em tarefas de similaridade texto/vetores (TF-IDF + similaridade do cosseno (cosine similarity))
- Faz com que produtos escalares correspondam mais diretamente à similaridade do cosseno
Quando usar
- Você se importa mais com ângulo/similaridade do cosseno do que com magnitude
- Recuperação de texto, representações vetoriais (embeddings), busca por vizinhos mais próximos
Ressalva
- Ela muda o significado dos atributos: remove a informação de magnitude total, que pode ser preditiva em algumas tarefas.
Orientação prática: escolhendo um escalador
Um conjunto útil de heurísticas:
- Comece com padronização para a maioria dos atributos numéricos contínuos e para modelos treinados com gradientes ou regularização.
- Use escalonamento min–max quando:
- os atributos são limitados e você quer ([0,1]), ou
- restrições do modelo/entrada esperam entradas limitadas.
- Use escalonamento robusto quando:
- valores atípicos são comuns e significativos (você não pode simplesmente removê-los).
- Use normalização quando:
- a magnitude da amostra não é significativa e a similaridade do cosseno é central.
Considere também restrições do domínio:
- Para atributos estritamente positivos e muito assimétricos (por exemplo, contagens, preços), uma transformação logarítmica (log transform) (ou outra transformação de potência) antes do escalonamento pode ser mais eficaz do que escalonar sozinho. Tecnicamente, isso é uma transformação de distribuição, e não apenas “escalonamento”, mas muitas vezes combina bem com padronização.
Escalonamento de atributos em pipelines reais (e evitando vazamento)
A regra central: ajuste escaladores apenas no conjunto de treinamento
O escalonamento usa estatísticas (média, desvio padrão, mínimo, máximo, mediana, IQR). Se você as calcula usando dados de validação ou teste, você vaza informação desses conjuntos para o treinamento. Isso é uma forma de vazamento de dados (leakage) e pode levar a pontuações de validação excessivamente otimistas que falham em produção.
Fluxo de trabalho correto:
- Divida os dados em treino/validação/teste (ou use validação cruzada (cross-validation)).
- Ajuste (fit) o escalador apenas nos dados de treinamento.
- Transforme (transform) treino, validação e teste usando o mesmo escalador ajustado.
Errado vs certo (conceitual)
Errado
- Escalonar o conjunto de dados inteiro
- Depois dividir em treino/teste
Isso permite que a distribuição do teste influencie os parâmetros de escalonamento.
Certo
- Dividir primeiro
- Depois ajustar o escalador apenas no treino
- Aplicar aos outros subconjuntos
Exemplo: escalonando atributos numéricos com um pipeline do scikit-learn
Este exemplo mostra a melhor prática: imputar + escalonar atributos numéricos, aplicar codificação one-hot em categóricos e então treinar um modelo—sem vazamento.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
# Example schema
numeric_features = ["age", "annual_income", "tenure_months"]
categorical_features = ["country", "plan_type"]
X = df[numeric_features + categorical_features]
y = df["churned"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
numeric_pipe = Pipeline(steps=[
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler()),
])
categorical_pipe = Pipeline(steps=[
("imputer", SimpleImputer(strategy="most_frequent")),
("onehot", OneHotEncoder(handle_unknown="ignore")),
])
preprocess = ColumnTransformer(
transformers=[
("num", numeric_pipe, numeric_features),
("cat", categorical_pipe, categorical_features),
]
)
model = Pipeline(steps=[
("preprocess", preprocess),
("clf", LogisticRegression(max_iter=1000))
])
model.fit(X_train, y_train)
print("Test score:", model.score(X_test, y_test))
Pontos-chave:
- O escalador é ajustado apenas dentro de
model.fit(X_train, y_train). - Durante
model.score(X_test, y_test), o encadeamento transformaX_testusando o escalador ajustado no treinamento. - Esse padrão se generaliza corretamente para validação cruzada.
Para mais sobre como estruturar pré-processamento com segurança, veja Pipelines (Pré-processamento de Aprendizado de Máquina + Modelagem).
Armadilha na validação cruzada: escalonar antes da validação cruzada
Um erro comum é:
X_scaled = StandardScaler().fit_transform(X) # leakage if done before CV
# then run cross_val_score on X_scaled
Isso vaza informação entre as dobras (folds). A correção é envolver escalonamento e modelagem em um encadeamento e fazer validação cruzada do encadeamento.
Observações específicas por modelo
Modelos lineares e regressão logística
- O escalonamento costuma ser essencial ao usar penalidades L1/L2.
- Ele também torna os coeficientes mais comparáveis (uma mudança de uma unidade vira uma mudança de um desvio padrão se padronizado).
SVMs (especialmente kernel RBF)
- Muito sensíveis à escala dos atributos porque kernels dependem de distâncias.
- Sempre escalone, a menos que os atributos já sejam comparáveis e bem limitados.
KNN / k-means
- O escalonamento pode mudar completamente vizinhanças/agrupamentos.
- Padronização ou escalonamento min–max são comuns; escalonamento robusto se valores atípicos forem severos.
Redes neurais
- O escalonamento de entrada geralmente melhora a estabilidade e a velocidade do treinamento.
- Nota: técnicas como Normalização em Lote (Batch Normalization) normalizam ativações intermediárias, mas não substituem totalmente um bom pré-processamento de entrada—especialmente quando as entradas têm faixas muito diferentes.
Modelos baseados em árvores
- O escalonamento geralmente não importa para desempenho.
- Mas pode importar quando árvores são combinadas com outros componentes (por exemplo, detecção de anomalias baseada em distância, Análise de Componentes Principais (PCA), modelos lineares em um ensemble empilhado (stacked ensemble)).
Armadilhas práticas e casos de borda
1) Vazamento de dados em séries temporais e cenários de streaming
Com dados dependentes do tempo, você deve respeitar a cronologia:
- Ajuste o escalador apenas com dados passados de treinamento.
- Aplique a janelas futuras de validação/teste.
- Evite usar estatísticas globais calculadas em todos os períodos de tempo.
Para streams em produção, considere escalonamento incremental (incremental scaling) (por exemplo, média/variância acumuladas) ou reajuste periódico, e monitore deriva (drift).
2) Escalonando atributos esparsos (por exemplo, one-hot / bag-of-words)
Atributos codificados em one-hot já estão em ({0,1}). Escaloná-los pode:
- Destruir a esparsidade (dependendo do escalador)
- Adicionar sobrecarga de computação/memória
- Não ajudar (e às vezes prejudicar)
Prática comum:
- Escalonar atributos numéricos densos
- Deixar atributos one-hot sem escalonamento
- Ou usar modelos que lidam naturalmente com escalas mistas via ramificações separadas de pré-processamento (como no exemplo de
ColumnTransformer)
3) Atributos de variância zero (constantes)
Se um atributo tem (\sigma = 0) (ou IQR = 0), padronização/escalonamento robusto é mal definido.
A maioria das bibliotecas lida com isso produzindo zeros para esse atributo, mas atributos constantes normalmente são inúteis e devem ser removidos (muitas vezes como parte da seleção de atributos).
Veja: Seleção de Atributos
4) Valores atípicos: escalonamento não os “resolve”
O escalonamento min–max comprime não-outliers quando existem extremos. A padronização ainda pode ser fortemente influenciada por valores atípicos.
Opções:
- Escalonamento robusto
- Transformar (log/potência)
- Recortar/winsorizar (winsorize) (dependente do domínio)
- Escolhas de modelo menos sensíveis a valores atípicos
5) Pré-processamento inconsistente entre treino e serving
Em produção, você deve aplicar o mesmo escalador ajustado usado durante o treinamento (mesmos parâmetros).
Melhor prática:
- Serializar o encadeamento completo (pré-processamento + modelo).
- Versioná-lo e implantá-lo como uma unidade.
- Monitorar distribuições de entrada para detectar deriva.
6) Misturar unidades e “zeros significativos”
O escalonamento muda a interpretação de uma “mudança de uma unidade”. Isso geralmente é aceitável para predição, mas pode confundir a interpretabilidade posterior:
- Padronização remove as unidades originais.
- Min–max cria uma escala sem unidade em [0,1]. Se você precisa de explicações em unidades originais, mantenha uma forma de inverter transformações ou documentá-las.
Intuição trabalhada: como o escalonamento muda um cálculo de distância
Dois pontos:
- A: idade = 20, renda = 30.000
- B: idade = 40, renda = 31.000
Diferenças brutas:
- diferença de idade = 20
- diferença de renda = 1.000
A distância euclidiana (em unidades brutas) é dominada pela renda:
[ \sqrt{20^2 + 1000^2} \approx 1000.2 ]
Se você padronizar ambos os atributos (de modo que a variação típica seja comparável), a distância reflete diferenças relativas (por exemplo, “quantos desvios padrão de distância”), o que geralmente é o que você quer para KNN/k-means/SVM.
Resumo
O escalonamento de atributos é uma etapa fundamental de pré-processamento que faz muitos algoritmos de aprendizado de máquina se comportarem corretamente e com eficiência. Ele importa mais para:
- Métodos baseados em distância (KNN, k-means, SVMs com kernel)
- Otimização baseada em gradiente (regressão linear/logística, redes neurais)
- Métodos baseados em variância/covariância (Análise de Componentes Principais (PCA))
Escolhas comuns incluem:
- Padronização (padrão, amplamente aplicável)
- Escalonamento min–max (faixa limitada, sensível a valores atípicos)
- Escalonamento robusto (resistente a valores atípicos)
- Normalização (norma unitária por amostra, comum para texto/representações vetoriais)
A regra prática mais importante é evitar vazamento: ajustar escaladores apenas nos dados de treinamento e integrar o escalonamento em um encadeamento adequado (especialmente sob validação cruzada).