Cómo hacer selección de features con Recursive Feature Elimination (RFE) en Machine Learning
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.