📊 MÓDULO 3: "Dimensionamento, Seleção e Extração de Características: A Arte de Preparar Entradas"

Objetivo:

Dominar como transformar, selecionar e criar características para que os modelos aprendam de forma eficiente, estável e sem viés numérico. Aprender por que nem todas as variáveis são úteis—e como fazer as úteis brilharem.


3.1 Por que Dimensionar Características?

Muitos algoritmos de ML (SVM, KNN, regressão logística, redes neurais) são sensíveis às escalas das características.

Imagine:

  • Característica 1: idade → intervalo de 18 a 90
  • Característica 2: renda_anual → intervalo de 20.000 a 500.000

Sem dimensionamento, o algoritmo dará MUITO mais peso a renda_anual simplesmente porque seus números são maiores—even if idade é mais preditiva!


3.2 Métodos de Dimensionamento

➤ StandardScaler (Padronização)

Transforma os dados para ter média = 0 e desvio padrão = 1.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df[['idade', 'renda_anual']] = scaler.fit_transform(df[['idade', 'renda_anual']])

Quando usar: Quando os dados seguem aproximadamente uma distribuição normal. Ideal para modelos lineares, SVM, redes neurais.


➤ MinMaxScaler (Normalização)

Transforma os dados para um intervalo fixo, tipicamente [0, 1].

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df[['valor_transacao', 'antiguidade_cliente']] = scaler.fit_transform(df[['valor_transacao', 'antiguidade_cliente']])

Quando usar: Quando você conhece os limites mín/máx, ou quando usa redes neurais com funções de ativação como sigmoide ou tanh.

⚠️ Cuidado com outliers: Um único valor extremo pode comprimir todo o resto do intervalo.


➤ RobustScaler

Usa a mediana e o intervalo interquartil (IQR). Robusto a outliers.

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
df[['valor_transacao']] = scaler.fit_transform(df[['valor_transacao']])

Quando usar: Quando você tem muitos outliers e não quer removê-los ou transformá-los.


📈 Visualização: Comparando Dimensionamentos

import matplotlib.pyplot as plt
import seaborn as sns

# Dados originais
original = df_original['valor_transacao'].values.reshape(-1, 1)
standard_scaled = StandardScaler().fit_transform(original)
minmax_scaled = MinMaxScaler().fit_transform(original)
robust_scaled = RobustScaler().fit_transform(original)

fig, ax = plt.subplots(2, 2, figsize=(12, 8))

sns.histplot(original, bins=30, ax=ax[0,0], kde=True)
ax[0,0].set_title("Original")

sns.histplot(standard_scaled, bins=30, ax=ax[0,1], kde=True)
ax[0,1].set_title("StandardScaler")

sns.histplot(minmax_scaled, bins=30, ax=ax[1,0], kde=True)
ax[1,0].set_title("MinMaxScaler")

sns.histplot(robust_scaled, bins=30, ax=ax[1,1], kde=True)
ax[1,1].set_title("RobustScaler")

plt.tight_layout()
plt.show()

3.3 Seleção de Características

Nem todas as variáveis são úteis. Algumas são redundantes, irrelevantes ou ruidosas. Mantê-las:

  • Aumenta o tempo de treinamento.
  • Pode causar overfitting.
  • Dificulta a interpretação.

➤ Eliminação baseada em variância

Se uma variável quase não muda (ex., 99% dos valores são 0), ela não adiciona informação.

from sklearn.feature_selection import VarianceThreshold

selector = VarianceThreshold(threshold=0.01)  # remove colunas com variância < 0.01
X_alta_variancia = selector.fit_transform(X)

➤ Seleção Univarida

Usa testes estatísticos para medir a relação entre cada característica e a variável alvo.

from sklearn.feature_selection import SelectKBest, f_classif

# Selecionar as 10 melhores características usando teste F de ANOVA
selector = SelectKBest(score_func=f_classif, k=10)
X_selecionado = selector.fit_transform(X, y)

# Ver pontuações
pontuacoes = selector.scores_
nomes_caracteristicas = X.columns
plt.figure(figsize=(10,6))
sns.barplot(x=pontuacoes, y=nomes_caracteristicas)
plt.title("Importância das Características (Teste F de ANOVA)")
plt.show()

➤ Eliminação Recursiva de Características (RFE)

Treina um modelo e remove iterativamente as características menos importantes.

from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

modelo_base = RandomForestClassifier(n_estimators=10, random_state=42)
rfe = RFE(estimator=modelo_base, n_features_to_select=8)
X_rfe = rfe.fit_transform(X, y)

# Ver características selecionadas
caracteristicas_selecionadas = X.columns[rfe.support_]
print("Características selecionadas:", caracteristicas_selecionadas.tolist())

3.4 Extração de Características

Em vez de selecionar, crie novas características a partir das existentes.

➤ Componentes Principais (PCA)

Reduz a dimensionalidade transformando variáveis originais em um conjunto menor de variáveis não correlacionadas (componentes principais).

from sklearn.decomposition import PCA

pca = PCA(n_components=5)  # reduzir para 5 componentes
X_pca = pca.fit_transform(X_dimensionado)

# Ver variância explicada por componente
plt.figure(figsize=(8,5))
plt.plot(range(1,6), pca.explained_variance_ratio_.cumsum(), marker='o')
plt.title("Variância Cumulativa Explicada pelos Componentes PCA")
plt.xlabel("Número de Componentes")
plt.ylabel("Variância Cumulativa")
plt.grid()
plt.show()

Quando usar PCA: Quando você tem muitas variáveis correlacionadas, ou para visualização (reduzir para 2D/3D).

⚠️ Desvantagem: Perde interpretabilidade. "Componente 1" não tem significado claro de negócio.


📝 Exercício 3.1: Transformação e Seleção de Características

Conjunto de dados: fraude_codificada.csv (do módulo anterior, já codificado)

Tarefas:

  1. Separar características (X) da variável alvo (y = eh_fraude).
  2. Dividir em treino/teste (80/20, estratificar=y).
  3. Aplicar StandardScaler a variáveis numéricas contínuas (ex., idade, renda, valor).
  4. Usar VarianceThreshold para remover características com variância < 0.01.
  5. Usar SelectKBest com f_classif para selecionar as 12 características mais relevantes.
  6. Treinar um modelo simples (Regressão Logística) com características selecionadas.
  7. Comparar desempenho (acurácia) com um modelo treinado em todas as características (sem seleção).

💡 Notas Adicionais:

  • Sempre aplique dimensionamento APENAS ao conjunto de treinamento, então use transform() (não fit_transform()) no teste.
  • Seleção de características deve ser feita DENTRO da validação cruzada para evitar métricas otimistas.
  • PCA não é mágica. Se suas variáveis já são poucas e não correlacionadas, PCA pode piorar o desempenho.
  • Em competições do Kaggle, engenharia de características frequentemente separa o top 10% do resto.

Course Info

Course: AI-course1

Language: PT

Lesson: Module3