Selección de características mediante la importación de características en bosques aleatorios con scikit-learn

12

He trazado las características importantes en bosques aleatorios con scikit-learn . Para mejorar la predicción utilizando bosques aleatorios, ¿cómo puedo usar la información de la parcela para eliminar características? Es decir, ¿cómo detectar si una característica es inútil o incluso peor, la disminución del rendimiento de los bosques al azar, según la información de la parcela? La trama se basa en el atributo feature_importances_y yo uso el clasificador sklearn.ensemble.RandomForestClassifier.

Soy consciente de que existen otras técnicas para la selección de funciones , pero en esta pregunta quiero centrarme en cómo usar las funciones feature_importances_.


Ejemplos de tales gráficos de importancia de características:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Franck Dernoncourt
fuente

Respuestas:

14

Simplemente puede usar el feature_importances_atributo para seleccionar las características con el puntaje de mayor importancia. Entonces, por ejemplo, podría usar la siguiente función para seleccionar las mejores características de K según su importancia.

def selectKImportance(model, X, k=5):
     return X[:,model.feature_importances_.argsort()[::-1][:k]]

O si está utilizando una tubería de la siguiente clase

class ImportanceSelect(BaseEstimator, TransformerMixin):
    def __init__(self, model, n=1):
         self.model = model
         self.n = n
    def fit(self, *args, **kwargs):
         self.model.fit(*args, **kwargs)
         return self
    def transform(self, X):
         return X[:,self.model.feature_importances_.argsort()[::-1][:self.n]]

Así por ejemplo:

>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import RandomForestClassifier
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target
>>> 
>>> model = RandomForestClassifier()
>>> model.fit(X,y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)
>>> 
>>> newX = selectKImportance(model,X,2)
>>> newX.shape
(150, 2)
>>> X.shape
(150, 4)

Y, claramente, si desea seleccionar en función de otros criterios que no sean "características principales", puede ajustar las funciones en consecuencia.

David
fuente
Gracias david ¿Alguna idea sobre cómo elegir el umbral por encima de qué características son útiles? (aparte de eliminar la característica menos útil, volver a ejecutar el RF y ver cómo afecta el rendimiento de la predicción)
Franck Dernoncourt
1
Al igual que con la mayoría de la selección de funciones automatizadas, diría que la mayoría de las personas usan una cuadrícula de ajuste. Pero usar la experiencia de dominio al seleccionar (y diseñar) características es probablemente la más valiosa, pero no es realmente automatizable.
David