Feature-Auswahl mithilfe von Feature-Wichtigkeiten in zufälligen Gesamtstrukturen mit Scikit-Learn

12

Ich habe die Feature-Wichtigkeiten in zufälligen Wäldern mit Scikit-Learn aufgezeichnet . Wie kann ich die Plotinformationen zum Entfernen von Features verwenden, um die Vorhersage mithilfe zufälliger Gesamtstrukturen zu verbessern? Dh wie kann man anhand der Plotinformationen erkennen, ob ein Feature nutzlos ist oder die Leistung der zufälligen Gesamtstrukturen noch schlimmer verringert? Der Plot basiert auf dem Attribut feature_importances_und ich benutze den Klassifikator sklearn.ensemble.RandomForestClassifier.

Ich bin mir bewusst, dass es andere Techniken für die Feature-Auswahl gibt , aber in dieser Frage möchte ich mich auf die Verwendung von Features konzentrieren feature_importances_.


Beispiele für solche Feature-Wichtigkeits-Diagramme:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Franck Dernoncourt
quelle

Antworten:

14

Sie können einfach das feature_importances_Attribut verwenden, um die Features mit der höchsten Wichtigkeitsbewertung auszuwählen. So können Sie beispielsweise die folgende Funktion verwenden, um die K besten Funktionen nach Wichtigkeit auszuwählen.

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

Oder wenn Sie eine Pipeline verwenden, die folgende Klasse

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

Also zum Beispiel:

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

Und wenn Sie eine Auswahl anhand anderer Kriterien als "Top-K-Funktionen" treffen möchten, können Sie die Funktionen einfach entsprechend anpassen.

David
quelle
Danke David. Gibt es einen Einblick, wie der Schwellenwert gewählt werden kann, oberhalb dessen Funktionen nützlich sind? (Abgesehen davon, dass Sie die am wenigsten nützliche Funktion entfernen, die RF erneut
ausführen
1
Wie bei den meisten automatisierten Funktionsauswahlen würde ich sagen, dass die meisten Leute ein Abstimmungsraster verwenden. Die Verwendung von Domänenkenntnissen bei der Auswahl (und Entwicklung) von Funktionen ist wahrscheinlich am wertvollsten - aber nicht wirklich automatisierbar.
David