(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como fazer selecção de features com Recursive Feature Elimination (RFE) em Machine Learning

João Barros 08 de November de 2026 4 min de leitura

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.