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

Cómo hacer selección de features con Recursive Feature Elimination (RFE) en Machine Learning

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

Este tutorial muestra cómo hacer selección de features con Recursive Feature Elimination (RFE) en Machine Learning usando scikit-learn. La selección de features reduce ruido, acelera el entrenamiento y ayuda a interpretar modelos, útil cuando tienes muchas variables.

Pré-requisitos

  • Python 3.8+ con scikit-learn, pandas y numpy instalados
  • Conocimientos básicos de Python y conceptos de Machine Learning (features, labels, overfitting)
  • Un entorno para ejecutar código (Jupyter, VS Code, o terminal)

Passo 1: Entender por qué usar RFE

RFE (Recursive Feature Elimination) elimina iterativamente features menos importantes según un estimador (por ejemplo, LogisticRegression o RandomForest). Es útil cuando buscas un subconjunto compacto de features que mantenga o mejore el rendimiento. Errores comunes: elegir un estimador débil, no validar la selección con cross-validation, o usar RFE en una base de datos pequeña sin repetición.

Passo 2: Preparar datos de ejemplo

Hemos creado un conjunto sintético para demostrar. Usé make_classification para controlar la relevancia de las 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

Evalúa un modelo sin selección para tener una referencia. Usa cross_val_score para obtener la media y la desviación estándar.

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

Usa RFE para seleccionar un número fijo k de features. Elige un estimador que proporcione coeficientes o 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

Compara el rendimiento del mismo estimador usando solo las features seleccionadas. Esto confirma si la selección ayudó o no.

X_sel = df_X[selected]
scores_sel = cross_val_score(clf, X_sel, df_y, cv=5, scoring='accuracy')
print('Acc con RFE:', scores_sel.mean(), '+/-', scores_sel.std())

Passo 6: Usar RFECV para escolher k automaticamente

RFECV hace RFE con validación cruzada para elegir el número óptimo de features. Esto evita elegir 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

Buenas prácticas: escalar features si el estimador es sensible (p. ej., LogisticRegression), usar distintos estimadores (RandomForest para relaciones no lineales), y envolver la selección dentro del pipeline para evitar data leakage. Ejemplo con 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 con RFE:', scores_pipe.mean())

Verificar o resultado

Confirma que las métricas (accuracy, precision/recall, AUC) con features seleccionadas son similares o mejores que la base. Verifica también la estabilidad: ejecuta RFECV varias veces con seeds diferentes y compara las features. Si la lista varía mucho, considera aumentar los datos o usar métodos alternativos (L1, basados en árboles).

Conclusão

RFE y RFECV son formas prácticas de reducir la dimensionalidad manteniendo el rendimiento del modelo. Próximos pasos: prueba con RandomForest como estimador, evalúa otras métricas (AUC) y combina con técnicas como PCA. Consejo: cuando las features seleccionadas no son estables entre ejecuciones, pregúntate si realmente necesitas selección o más datos.