Como fazer selecção de features com Recursive Feature Elimination (RFE) em Machine Learning
Este tutorial mostra como fazer selecção de features com Recursive Feature Elimination (RFE) em Machine Learning usando scikit-learn. A selecção de features reduz ruído, acelera o treino e ajuda a interpretar modelos, útil quando tem muitas variáveis.
Pré-requisitos
- Python 3.8+ com scikit-learn, pandas e numpy instalados
- Conhecimentos básicos de Python e conceitos de Machine Learning (features, labels, overfitting)
- Um ambiente para correr código (Jupyter, VS Code, ou terminal)
Passo 1: Entender por que usar RFE
RFE (Recursive Feature Elimination) elimina iterativamente features menos importantes segundo um estimador (por exemplo, LogisticRegression ou RandomForest). É útil quando pretende um subconjunto compacto de features que mantenha ou melhore o desempenho. Erros comuns: escolher um estimador fraco, não validar a selecção com cross-validation, ou usar RFE numa base de dados pequena sem repetição.
Passo 2: Preparar dados de exemplo
Criámos um conjunto sintético para demonstrar. Usei make_classification para controlar a relevância das features.
from sklearn.datasets import make_classification
import pandas as pd
X, y = make_classification(n_samples=1000, n_features=20, n_informative=5,
n_redundant=2, n_repeated=0, random_state=42)
cols = [f'feat_{i}' for i in range(X.shape[1])]
df_X = pd.DataFrame(X, columns=cols)
df_y = pd.Series(y, name='target')
Passo 3: Fazer uma avaliação base do modelo
Avalie um modelo sem selecção para ter uma referência. Use cross_val_score para obter a média e o desvio padrão.
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
clf = LogisticRegression(max_iter=1000, solver='liblinear')
scores = cross_val_score(clf, df_X, df_y, cv=5, scoring='accuracy')
print('Acc base:', scores.mean(), '+/-', scores.std())
Passo 4: Aplicar RFE simples
Use RFE para seleccionar um número fixo k de features. Escolha um estimador que forneça coeficientes ou feature_importances_.
from sklearn.feature_selection import RFE
rfe = RFE(estimator=LogisticRegression(max_iter=1000, solver='liblinear'), n_features_to_select=5)
rfe.fit(df_X, df_y)
selected = df_X.columns[rfe.support_].tolist()
print('Features seleccionadas:', selected)
Passo 5: Avaliar modelo com features seleccionadas
Compare o desempenho do mesmo estimador usando apenas as features seleccionadas. Isto confirma se a selecção ajudou ou não.
X_sel = df_X[selected]
scores_sel = cross_val_score(clf, X_sel, df_y, cv=5, scoring='accuracy')
print('Acc com RFE:', scores_sel.mean(), '+/-', scores_sel.std())
Passo 6: Usar RFECV para escolher k automaticamente
RFECV faz RFE com validação cruzada para escolher o número óptimo de features. Isto evita escolher k arbitrariamente.
from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
cv = StratifiedKFold(5)
rfecv = RFECV(estimator=LogisticRegression(max_iter=1000, solver='liblinear'), cv=cv, scoring='accuracy')
rfecv.fit(df_X, df_y)
print('Nº ót. features:', rfecv.n_features_)
opt_sel = df_X.columns[rfecv.support_].tolist()
print('Features ótimas:', opt_sel)
Passo 7: Boas práticas e variações
Boas práticas: escalonar features se o estimador for sensível (ex.: LogisticRegression), usar diferentes estimadores (RandomForest para relações não lineares), e envolver a selecção dentro do pipeline para evitar data leakage. Exemplo com Pipeline:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
pipe = Pipeline([('scaler', StandardScaler()),
('rfe', RFE(LogisticRegression(max_iter=1000, solver='liblinear'), n_features_to_select=5)),
('clf', LogisticRegression(max_iter=1000, solver='liblinear'))])
scores_pipe = cross_val_score(pipe, df_X, df_y, cv=5)
print('Acc pipeline com RFE:', scores_pipe.mean())
Verificar o resultado
Confirme que as métricas (accuracy, precision/recall, AUC) com features seleccionadas são semelhantes ou melhores que a base. Verifique também a estabilidade: execute RFECV várias vezes com seeds diferentes e compare as features. Se a lista variar muito, considere aumentar os dados ou usar métodos alternativos (L1, baseados em árvores).
Conclusão
RFE e RFECV são formas práticas de reduzir a dimensionalidade mantendo o desempenho do modelo. Próximos passos: experimente com RandomForest como estimador, avalie outras métricas (AUC) e combine com técnicas como PCA. Dica: quando as features seleccionadas não são estáveis entre execuções, pergunte-se se precisa realmente de selecção ou de mais dados.