Sélection de fonctionnalités à l'aide d'importances de fonctionnalités dans des forêts aléatoires avec scikit-learn

12

J'ai tracé les importances des fonctionnalités dans des forêts aléatoires avec scikit-learn . Afin d'améliorer la prédiction à l'aide de forêts aléatoires, comment puis-je utiliser les informations de tracé pour supprimer des entités? C'est-à-dire comment repérer si une fonctionnalité est inutile ou pire encore une diminution des performances des forêts aléatoires, sur la base des informations de la parcelle? L'intrigue est basée sur l'attribut feature_importances_et j'utilise le classificateur sklearn.ensemble.RandomForestClassifier.

Je suis conscient qu'il existe d' autres techniques de sélection de fonctionnalités , mais dans cette question, je veux me concentrer sur la façon d'utiliser les fonctionnalités feature_importances_.


Exemples de tels diagrammes d'importance des caractéristiques:

entrez la description de l'image ici

entrez la description de l'image ici

Franck Dernoncourt
la source

Réponses:

14

Vous pouvez simplement utiliser l' feature_importances_attribut pour sélectionner les entités ayant le score d'importance le plus élevé. Ainsi, par exemple, vous pouvez utiliser la fonction suivante pour sélectionner les K meilleures fonctionnalités en fonction de leur importance.

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

Ou si vous utilisez un pipeline, la classe suivante

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]]

Ainsi, par exemple:

>>> 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)

Et clairement, si vous souhaitez sélectionner en fonction d'autres critères que les «principales fonctionnalités k», vous pouvez simplement ajuster les fonctions en conséquence.

David
la source
Merci David. Avez-vous une idée de la façon de choisir le seuil au-dessus duquel les fonctionnalités sont utiles? (mis à part la suppression de la fonctionnalité la moins utile, l'exécution de la RF à nouveau et voir comment cela affecte les performances de prédiction)
Franck Dernoncourt
1
Comme pour la sélection de fonctionnalités la plus automatisée, je dirais que la plupart des gens utilisent une grille de réglage. Mais l'utilisation de l'expertise du domaine lors de la sélection (et de l'ingénierie) des fonctionnalités est probablement la plus précieuse - mais n'est pas vraiment automatisable.
David