Selección Secuencial de Características

Un enfoque alternativo es el llamado Sequential Feature Selection (SFSSelección Secuencial de Características), ofrecida por Scikit-Learn en la clase SequentialFeatureSelector. En este enfoque partimos de todas las características y se van eliminando una por una, o partimos de un subconjunto vacío de éstas y se van añadiendo una por una. En cada iteración, se escoge la característica basándose en el resultado devuelto por el modelo siendo escogido tras eliminar o añadir cada característica, siendo ésta la principal diferencia con RFE: En RFE el modelo se va a entrar una vez en cada iteración y, en función de la importancia asignada a cada característica, se va a seleccionar una de ellas, mientras que en SFS es necesario entrar tantos modelos como características estemos evaluando para escoger aquella que mejor impacte en el resultado del modelo. De hecho, si se está aplicando validación cruzada dividiendo el dataset en k bloques, el número de modelos a entrenar en SFS sería igual al número de características siendo evaluadas multiplicado por k, lo que supone que este enfoque puede resultar mucho más lento que RFE.

Apliquémoslo al dataset wine usando también en este caso el algoritmo RandomForestClassifier, seleccionando 5 características predictivas y especificando 3 divisiones en la validación cruzada:

from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
selector = SequentialFeatureSelector(
                estimator = model,
                n_features_to_select = 5,
                direction = "forward",
                cv = 3
            )

El parámetro direction puede tomar los valores "forward" o "backward", indicando si partimos de un subconjunto vacío de características al que las vamos añadiendo una por una (primer caso), o si partimos de todas las características y las vamos eliminando una por una (segundo caso).

Ahora entrenamos el selector:

selector.fit(X, y)

Selección Secuencial de Características

Los métodos y atributos disponibles en esta clase son semejantes a los disponibles en otros selectores. Por ejemplo, el método .get_feature_names_out() devuelve los nombres de las características seleccionadas:

selector.get_feature_names_out()
array(['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium'],
      dtype=object)