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.
Muitos algoritmos de ML (SVM, KNN, regressão logística, redes neurais) são sensíveis às escalas das características.
Imagine:
idade → intervalo de 18 a 90renda_anual → intervalo de 20.000 a 500.000Sem dimensionamento, o algoritmo dará MUITO mais peso a renda_anual simplesmente porque seus números são maiores—even if idade é mais preditiva!
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.
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.
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.
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()
Nem todas as variáveis são úteis. Algumas são redundantes, irrelevantes ou ruidosas. Mantê-las:
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)
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()
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())
Em vez de selecionar, crie novas características a partir das existentes.
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.
Conjunto de dados: fraude_codificada.csv (do módulo anterior, já codificado)
Tarefas:
X) da variável alvo (y = eh_fraude).StandardScaler a variáveis numéricas contínuas (ex., idade, renda, valor).VarianceThreshold para remover características com variância < 0.01.SelectKBest com f_classif para selecionar as 12 características mais relevantes.transform() (não fit_transform()) no teste.