Aprender a converter texto, rótulos e categorias em números que os modelos podem entender—sem introduzir viés ou distorção.
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.
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).
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:
⚠️ Desvantagens:
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:
⚠️ Riscos:
✅ Solução: Usar validação cruzada ou adicionar ruído.
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()
Conjunto de dados: fraude_limpo.csv (do módulo anterior)
Tarefas:
nivel_risco (assuma que é ordinal: "Baixo", "Médio", "Alto").tipo_cartao e pais. Use drop='first'.cidade (use apenas o conjunto de treinamento para calcular médias—evite vazamento de dados!).OrdinalEncoder para variáveis ordinais (melhor que LabelEncoder para múltiplas colunas).