⚙️ Pré-processamento de Dados¶
O pré-processamento é uma etapa fundamental em Machine Learning, pois garante que os dados estejam em um formato adequado para os algoritmos.
Aqui abordaremos:
- Normalização
- Padronização
- Feature Scaling (com exemplo prático em KNN)
- Codificação de variáveis
🔹 Normalização¶
O que é?¶
A normalização refere-se ao processo de ajustar valores em escalas diferentes para uma escala comum.
Ela é particularmente útil quando a distribuição dos dados é desconhecida ou não segue uma distribuição gaussiana.
Principais tipos de normalização¶
-
Min-Max (mínimo e máximo)
Redimensiona os valores para um intervalo específico, geralmente[0, 1].
Exemplo: o menor valor vira0, o maior vira1. -
Logarithmic Scaling (normalização logarítmica)
Aplica uma transformação logarítmica para reduzir o impacto de valores muito altos. -
Escala decimal
Desloca o ponto decimal para tornar os valores mais manejáveis sem alterar as diferenças relativas. -
Normalização da média (centralização da média)
Subtrai a média de cada valor, centralizando os dados em torno de0.
Quando utilizar?¶
- Quando os dados possuem distribuição desconhecida ou não-gaussiana
- Em algoritmos baseados em distância (KNN, SVM, KMeans), para evitar que variáveis com escalas maiores dominem os cálculos.
Exemplo com Scikit-Learn¶
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# Exemplo: valores de tamanho de casas
X = np.array([[500], [1000], [1500], [2000]])
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
print("Original:", X.ravel())
print("Normalizado:", X_scaled.ravel())
🔹 Padronização¶
Enquanto a normalização ajusta os dados para um intervalo específico, a padronização transforma os dados para que tenham:
-
Média = 0
-
Desvio padrão = 1
Essa técnica é também conhecida como z-score scaling.
Fórmula
Onde:
-
X é o valor original
-
μ é a média
-
σ é o desvio padrão
Exemplo com Scikit-Learn
from sklearn.preprocessing import StandardScaler
import numpy as np
# Exemplo: valores de preços de casas
X = np.array([[100000], [200000], [400000], [800000]])
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("Original:", X.ravel())
print("Padronizado:", np.round(X_scaled.ravel(), 2))
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
🔹 Feature Scaling (Escalonamento de Variáveis)
O escalonamento de variáveis é crucial em algoritmos baseados em distâncias, como o KNN. A imagem abaixo mostra como os limites de decisão mudam drasticamente dependendo se os dados foram escalados ou não.
Retirado da documentação oficial do Scikit-Learn.org
No lado esquerdo, sem escalonamento, a variável "proline" domina a decisão do modelo, pois seus valores variam aproximadamente entre 0 e 1.000, enquanto a variável "hue" varia apenas entre 1 e 10. Isso faz com que diferenças em “hue” sejam praticamente ignoradas.
No lado direito, após aplicar o StandardScaler, ambas as variáveis são transformadas para uma escala aproximada entre -3 e 3, permitindo que o modelo leve em consideração de forma equilibrada as duas variáveis. Assim, a estrutura de vizinhança muda completamente e os limites de decisão se tornam mais representativos.
🔹 Codificação de Variáveis
Preferencialmente feito utilizando pandas
Muitos algoritmos não trabalham diretamente com variáveis categóricas, sendo necessário convertê-las em valores numéricos.
One-Hot Encoding
Cria colunas binárias para cada categoria. Exemplo: cor = [vermelho, azul, verde] vira cor_vermelho, cor_azul, cor_verde.
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
df = pd.DataFrame({"Cor": ["vermelho", "azul", "verde", "azul"]})
encoder = OneHotEncoder(sparse_output=False)
encoded = encoder.fit_transform(df[["Cor"]])
print(pd.DataFrame(encoded, columns=encoder.get_feature_names_out(["Cor"])))
Atribui inteiros para cada categoria. Exemplo: vermelho=0, azul=1, verde=2.
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
labels = le.fit_transform(df["Cor"])
print(labels)
Documentação criada por Tiago Bittencourt (@TiagoSBittencourt)