Feature engineering é a arte de transformar dados brutos em features que melhor representam o problema subjacente. É frequentemente mais importante que a escolha do algoritmo.
A feature deve estar correlacionada com o target. Features irrelevantes adicionam ruído.
Features devem ser independentes entre si (evitar multicolinearidade). Quando features são altamente correlacionadas, o modelo tem dificuldade em aprender.
Features simples são preferíveis a complexas. Princípio de Occam: a solução mais simples é geralmente a melhor.
Você deve entender o que cada feature representa. Modelos interpretáveis são mais confiáveis.
StandardScaler: Centraliza em 0 com desvio padrão 1
x_scaled = (x - mean) / std
x_scaled = (x - mean) / std
MinMaxScaler: Escala para [0, 1]
x_scaled = (x - min) / (max - min)
x_scaled = (x - min) / (max - min)
RobustScaler: Resistente a outliers
x_scaled = (x - median) / IQR
x_scaled = (x - median) / IQR
One-Hot Encoding: Cria coluna binária para cada categoria
Label Encoding: Mapeia categorias para inteiros
Target Encoding: Usa média do target por categoria
Interações: Multiplicar features existentes
df['price_per_sqm'] = df['price'] / df['area']
df['age_price_interaction'] = df['age'] * df['price']
df['price_per_sqm'] = df['price'] / df['area']
df['age_price_interaction'] = df['age'] * df['price']
Polinômios: Elevar features a potências
df['price_squared'] = df['price'] ** 2
df['sqrt_area'] = np.sqrt(df['area'])
df['price_squared'] = df['price'] ** 2
df['sqrt_area'] = np.sqrt(df['area'])
Agregações: Agrupar e sumarizar dados
df['avg_price_by_neighborhood'] = df.groupby('neighborhood')['price'].transform('mean')
df['avg_price_by_neighborhood'] = df.groupby('neighborhood')['price'].transform('mean')
price_per_sqm = price / area
age = current_year - construction_year
has_garage = 1 se garage_spaces > 0, 0 caso contrário
total_rooms = bedrooms + bathrooms
price_per_room = price / (bedrooms + bathrooms)
neighborhood_avg_price = média de preço por bairro
Use técnicas como:
correlations = df.corr()['price'].sort_values(ascending=False)
correlations = df.corr()['price'].sort_values(ascending=False)
Avaliar impacto de cada feature:
from sklearn.model_selection import cross_val_score
# Com feature
score_with = cross_val_score(model, X_with_feature, y)
# Sem feature
score_without = cross_val_score(model, X_without_feature, y)
improvement = score_with.mean() - score_without.mean()
from sklearn.model_selection import cross_val_score
# Com feature
score_with = cross_val_score(model, X_with_feature, y)
# Sem feature
score_without = cross_val_score(model, X_without_feature, y)
improvement = score_with.mean() - score_without.mean()
Usar informações do futuro ou target na feature. Exemplo: usar preço final para criar feature.
Criar muitas features complexas que capturam ruído, não padrões reais.
Muitas features com poucos dados leva a overfitting.
Feature engineering é tanto arte quanto ciência. Requer criatividade, conhecimento de domínio e validação rigorosa. Investir tempo aqui geralmente rende melhores resultados que otimizar algoritmos.
Lembre-se: garbage in, garbage out. Features boas são a base de um modelo bom!