Feature Engineering com Python: Melhorando a Performance de Modelos

Quando falamos em Ciência de Dados e Machine Learning, muito se discute sobre modelos poderosos: árvores de decisão, redes neuraisregressões complexas. Porém, há um ponto fundamental que diferencia um modelo mediano de um modelo realmente eficaz: as features utilizadas.

O processo de Feature Engineering é a arte (e ciência) de criar, transformar e selecionar variáveis que melhor representem os padrões escondidos nos dados. Muitas vezes, um modelo simples com boas features supera um modelo complexo com features ruins.

Neste artigo, vamos explorar técnicas de Feature Engineering em Python, mostrando como melhorar a performance de modelos por meio da construção inteligente de variáveis.


1. O que é Feature Engineering?

Features são os atributos (colunas) que descrevem o problema. Por exemplo:

  • Em um modelo de crédito: renda, idade, histórico de pagamento.

  • Em um modelo de recomendação: gênero de filmes, tempo médio de uso, histórico de compras.

  • Em séries temporais: vendas passadas, dia da semana, sazonalidade.

Feature Engineering envolve:

  • Criar novas variáveis a partir de dados existentes.

  • Transformar variáveis para deixá-las mais informativas.

  • Selecionar as features mais relevantes para reduzir ruído.


2. Carregando dados de exemplo

Vamos usar um dataset fictício de clientes:

import pandas as pd

data = pd.DataFrame({
    "idade": [25, 45, 35, 50, 23],
    "renda": [2500, 8000, 4500, 12000, 2000],
    "cidade": ["SP", "RJ", "SP", "MG", "RJ"],
    "compras_ult_mes": [2, 10, 4, 15, 1],
    "score_credito": [650, 720, 690, 780, 600]
})

print(data)

3. Criação de novas variáveis (Feature Creation)

3.1 Variáveis derivadas

Podemos criar variáveis a partir de transformações matemáticas.

# Relação entre renda e idade
data["renda_por_idade"] = data["renda"] / data["idade"]

# Escala logarítmica (útil para distribuições assimétricas)
import numpy as np
data["log_renda"] = np.log1p(data["renda"])

3.2 Variáveis categóricas em múltiplos níveis

# Indicador binário
data["alta_renda"] = (data["renda"] > 5000).astype(int)

3.3 Interações entre variáveis

Criar features interativas pode capturar relações não-lineares.

data["idade_x_compras"] = data["idade"] * data["compras_ult_mes"]

4. Transformação de variáveis categóricas

Variáveis categóricas precisam ser transformadas em números.

4.1 One-Hot Encoding

data = pd.get_dummies(data, columns=["cidade"], drop_first=True)

4.2 Target Encoding

Substitui a categoria pela média da variável alvo.

data["cidade_encoded"] = data.groupby("cidade")["score_credito"].transform("mean")

5. Features temporais

Se os dados têm um componente temporal, extrair variáveis de datas pode ser crucial.

data["data_compra"] = pd.to_datetime(["2023-01-10", "2023-02-15", "2023-02-20", "2023-03-05", "2023-01-25"])

data["ano"] = data["data_compra"].dt.year
data["mes"] = data["data_compra"].dt.month
data["dia_semana"] = data["data_compra"].dt.dayofweek

Essas variáveis ajudam a capturar sazonalidade e padrões semanais/mensais.


6. Redução de dimensionalidade

Se o número de variáveis é muito grande, podemos reduzir dimensões para melhorar performance e evitar overfitting.

6.1 PCA (Principal Component Analysis)

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

X = data[["idade", "renda", "compras_ult_mes", "score_credito"]]

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

6.2 Seleção baseada em importância

from sklearn.ensemble import RandomForestClassifier

X = data.drop("alta_renda", axis=1)
y = data["alta_renda"]

model = RandomForestClassifier()
model.fit(X, y)

importances = pd.Series(model.feature_importances_, index=X.columns)
print(importances.sort_values(ascending=False))

7. Normalização e Padronização

Muitos algoritmos (SVM, KNN, Redes Neurais) exigem que os dados estejam na mesma escala.

from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler = StandardScaler()
data_scaled = scaler.fit_transform(data[["idade", "renda", "compras_ult_mes"]])

minmax = MinMaxScaler()
data_normalized = minmax.fit_transform(data[["idade", "renda", "compras_ult_mes"]])

8. Automação com Pipelines

Pipelines permitem aplicar todas as etapas de Feature Engineering de forma organizada e reaplicável.

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression

pipeline = Pipeline([
    ("imputer", SimpleImputer(strategy="mean")),
    ("scaler", StandardScaler()),
    ("model", LogisticRegression())
])

pipeline.fit(X, y)

9. Boas práticas em Feature Engineering

  • Entenda o problema de negócio: crie variáveis que façam sentido no contexto.

  • Evite overfitting: não crie features específicas demais.

  • Use conhecimento do domínio: em finanças, criar índices de endividamento; em saúde, indicadores clínicos.

  • Valide cada feature criada: nem toda variável ajuda, algumas podem prejudicar.

  • Teste interações não óbvias: às vezes a relação entre duas variáveis revela padrões escondidos.


10. Conclusão

Feature Engineering é o coração de um projeto de Machine Learning bem-sucedido. Enquanto muitos concentram esforços apenas no ajuste de algoritmos, os melhores resultados vêm de quem investe tempo em entender e transformar os dados.

Com Python, utilizando bibliotecas como Pandas, NumPy, Scikit-learn e ferramentas de visualização, é possível criar, testar e automatizar features que realmente aumentam a performance dos modelos.

Comentários

Postagens mais visitadas deste blog

Python para Computação Quântica: Introdução com Qiskit

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Estrutura Básica de um Programa C# com exemplos