Feature engineering sério
- ⬜📈 Regressão e classificação na prática(Machine Learning Clássico)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Feature engineering ainda é 80% do ganho em tabular
Em 2026, com AutoML e boosting nativo, feature engineering continua sendo o diferencial. O modelo aprende o que você der: se as variáveis certas não existem, nenhum hiperparâmetro recupera. O trabalho é codificar conhecimento de domínio em colunas numéricas.
Categorical encoding
| Codificação | Cardinalidade que suporta | Risco | Cabe com |
|---|---|---|---|
| Indicadora por categoria | Baixa (até dezenas) | Explosão de colunas | Modelos lineares |
| Ordinal | Qualquer | Inventa ordem onde não há | Árvores, que não leem o número como grandeza |
| Por média do alvo | Alta | Vazamento — precisa ser calculada DENTRO de cada partição da validação | Árvores impulsionadas, com cuidado |
| Por frequência | Alta | Duas categorias com a mesma frequência colidem | Árvores |
| Vetor aprendido | Muito alta | Exige dado suficiente para treinar | Redes e modelos de recomendação |
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
from category_encoders import TargetEncoder, LeaveOneOutEncoder
# One-hot: bom para baixa cardinalidade (< 20 categorias)
ohe = OneHotEncoder(handle_unknown='ignore', sparse_output=True)
# Ordinal: use apenas quando há ordem real (small/medium/large)
oe = OrdinalEncoder(categories=[['small', 'medium', 'large']])
# Target encoding out-of-fold (seguro contra leakage)
te = TargetEncoder(smoothing=10) # smoothing evita overfit em categorias raras
# LeaveOneOut — variante que exclui a linha atual do cálculo
loo = LeaveOneOutEncoder(sigma=0.05) # adiciona ruído pra robustezRegra prática: one-hot para baixa cardinalidade; target encoding (out-of-fold) para alta cardinalidade em árvores; hashing trick quando cardinalidade explode (IP, user_id).
Transformações numéricas
import numpy as np
from sklearn.preprocessing import PowerTransformer, StandardScaler
# Log1p para valores com zero (log(0) seria -inf)
df['log_price'] = np.log1p(df['price'])
# Box-Cox/Yeo-Johnson — generalização com parâmetro lambda aprendido
pt = PowerTransformer(method='yeo-johnson', standardize=True)
X_transformed = pt.fit_transform(X[['price', 'income']])
# Binning — transformar contínuo em categorias (quartis, deciles)
df['age_bin'] = pd.qcut(df['age'], q=10, labels=False, duplicates='drop')
# Interações explícitas (quando modelo linear não captura)
df['price_per_area'] = df['price'] / df['area']
df['income_x_tenure'] = df['income'] * df['tenure_years']Por que engenharia de atributos ainda importa com modelos poderosos?
Features temporais
# Decompose timestamp em componentes cíclicas
df['hour'] = df['ts'].dt.hour
df['dow'] = df['ts'].dt.dayofweek
df['month'] = df['ts'].dt.month
# Encoding cíclico (sin/cos) para hora e dia-da-semana
df['hour_sin'] = np.sin(2 * np.pi * df['hour'] / 24)
df['hour_cos'] = np.cos(2 * np.pi * df['hour'] / 24)
# Lags e rolling (cuidado com leakage!)
df = df.sort_values(['user_id', 'ts'])
df['price_lag_1'] = df.groupby('user_id')['price'].shift(1)
df['price_rolling_7'] = (
df.groupby('user_id')['price']
.shift(1) # shift ANTES do rolling — crítico
.rolling(window=7, min_periods=1)
.mean()
.reset_index(level=0, drop=True)
)Todo rolling/agregação temporal deve vir após um shift(1). Caso contrário você soma o valor atual na janela e vaza o próprio target.
Checklist anti-leakage
- Split treino/teste antes de qualquer fit de scaler/encoder
- Target encoding sempre out-of-fold ou com holdout dedicado
- Features temporais derivadas apenas de dados com timestamp < ts da linha
- Nenhuma feature do tipo "total final do cliente" em predição intra-período
Se o seu AUC em validação é muito maior que o AUC em A/B de produção, 95% das vezes é feature leakage. Audite cada coluna perguntando: "essa informação estava realmente disponível naquele instante?"
Perguntas frequentes
❓ Como codificar variável categórica?
❓ O que é vazamento de dado e como evitar?
❓ Vale investir em atributos ou em modelo mais forte?
Fixando
Qual armadilha é específica de atributos com dependência temporal?
Como codificar uma variável categórica de alta cardinalidade?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…