🧩 MÓDULO 2: "Traduzindo o Mundo Real: Codificando Variáveis Categóricas"

Objetivo:

Aprender a converter texto, rótulos e categorias em números que os modelos podem entender—sem introduzir viés ou distorção.


2.1 Por que Codificar?

Algoritmos de ML (regressão, SVM, redes neurais) só entendem números. Eles não podem processar "Visa", "Mastercard" ou "Espanha" diretamente.

Mas… cuidado! Não se trata apenas de atribuir números arbitrários. Como você codifica afeta o desempenho e a interpretação do modelo.


2.2 Codificação de Rótulos (Label Encoding)

Atribui um inteiro único a cada categoria.

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['tipo_cartao_codificado'] = le.fit_transform(df['tipo_cartao'])

# Exemplo: ["Visa", "Mastercard", "Amex"] → [0, 1, 2]

⚠️ Problema sério: Introduz ordem artificial. O modelo pode interpretar "2" > "1" > "0", como se "Amex" fosse "melhor" que "Visa". Isso é incorreto se não existir ordem real.

Quando usar: Apenas para variáveis ORDINAIS (ex., "Baixo", "Médio", "Alto") ou árvores de decisão (que não assumem ordem linear).


2.3 Codificação One-Hot

Cria uma coluna binária (0/1) para cada categoria.

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

ohe = OneHotEncoder(sparse_output=False, drop='first')  # drop='first' evita multicolinearidade
categorias_codificadas = ohe.fit_transform(df[['tipo_cartao']])

# Converter para DataFrame com nomes
df_ohe = pd.DataFrame(categorias_codificadas, columns=ohe.get_feature_names_out(['tipo_cartao']))
df = pd.concat([df.reset_index(drop=True), df_ohe], axis=1)

Vantagens:

  • Não introduz ordem falsa.
  • Ideal para modelos lineares, SVM, redes neurais.

⚠️ Desvantagens:

  • Aumenta muito a dimensionalidade (50 países → 50 colunas).
  • Pode causar a "maldição da dimensionalidade."

2.4 Codificação de Alvo (Target Encoding)

Substitui cada categoria pela média da variável alvo para essa categoria.

# Exemplo: tipo_cartao → média de "eh_fraude" para aquele tipo de cartão
media_alvo = df.groupby('tipo_cartao')['eh_fraude'].mean()
df['tipo_cartao_codificado_alvo'] = df['tipo_cartao'].map(media_alvo)

Vantagens:

  • Captura informação preditiva diretamente.
  • Não aumenta a dimensionalidade.

⚠️ Riscos:

  • Vazamento de dados se calculado antes de dividir treino/teste.
  • Overfitting se uma categoria tiver poucos exemplos.

Solução: Usar validação cruzada ou adicionar ruído.


📊 Visualização: Comparando Codificações

fig, ax = plt.subplots(1, 3, figsize=(15, 5))

# Original
sns.countplot(data=df, x='tipo_cartao', ax=ax[0])
ax[0].set_title("Original")

# Codificação de Rótulos
sns.histplot(df['tipo_cartao_codificado'], bins=3, ax=ax[1])
ax[1].set_title("Codificação de Rótulos")

# One-Hot (mostrar uma coluna)
sns.histplot(df['tipo_cartao_Mastercard'], bins=2, ax=ax[2])
ax[2].set_title("One-Hot (ex., Mastercard)")

plt.tight_layout()
plt.show()

📝 Exercício 2.1: Codificação Inteligente

Conjunto de dados: fraude_limpo.csv (do módulo anterior)

Tarefas:

  1. Aplique Codificação de Rótulos à coluna nivel_risco (assuma que é ordinal: "Baixo", "Médio", "Alto").
  2. Aplique Codificação One-Hot a tipo_cartao e pais. Use drop='first'.
  3. Aplique Codificação de Alvo a cidade (use apenas o conjunto de treinamento para calcular médias—evite vazamento de dados!).
  4. Compare a forma do DataFrame antes e depois. Quantas colunas novas foram criadas?
  5. Remova as colunas de texto originais (mantenha apenas as codificadas).

💡 Notas Adicionais:

  • Sempre codifique APÓS dividir treino/teste para evitar vazamento de dados.
  • One-Hot é padrão para a maioria dos modelos.
  • Codificação de Alvo é poderosa mas perigosa. Use com cautela e validação cruzada.
  • Scikit-learn tem OrdinalEncoder para variáveis ordinais (melhor que LabelEncoder para múltiplas colunas).


Course Info

Course: AI-course1

Language: PT

Lesson: Module2