Wybór funkcji za pomocą importu funkcji w losowych lasach za pomocą scikit-learn

12

Mam kreślone na importances cechą w lasy losowe z scikit-learn . W jaki sposób mogę wykorzystać informacje o działce do usunięcia funkcji w celu poprawy prognozowania przy użyciu losowych lasów? Tj. Jak na podstawie informacji o działce stwierdzić, czy funkcja jest bezużyteczna, a nawet gorzej obniża wydajność losowych lasów? Fabuła oparta jest na atrybucie feature_importances_i używam klasyfikatora sklearn.ensemble.RandomForestClassifier.

Wiem, że istnieją inne techniki wyboru funkcji , ale w tym pytaniu chcę skupić się na sposobie korzystania z funkcji feature_importances_.


Przykłady takich wykresów ważności cech:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Franck Dernoncourt
źródło

Odpowiedzi:

14

Możesz po prostu użyć tego feature_importances_atrybutu, aby wybrać funkcje o najwyższym wyniku ważności. Na przykład możesz użyć poniższej funkcji, aby wybrać K najlepszych funkcji zgodnie z ważnością.

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

Lub jeśli używasz potoku następującej klasy

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

Na przykład:

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

I oczywiście, jeśli chcesz wybrać na podstawie innych kryteriów niż „najlepsze funkcje k”, możesz po prostu odpowiednio dostosować funkcje.

David
źródło
Dzięki David. Wgląd w to, jak wybrać próg, powyżej którego funkcje są przydatne? (pomijając usunięcie najmniej użytecznej funkcji, ponowne uruchomienie RF i zobaczenie, jak wpływa to na wydajność prognozowania)
Franck Dernoncourt
1
Podobnie jak w przypadku większości zautomatyzowanych wyborów funkcji, powiedziałbym, że większość ludzi używa siatki tuningowej. Ale korzystanie z wiedzy specjalistycznej w dziedzinie przy wyborze (i inżynierii) funkcji jest prawdopodobnie najcenniejsze - ale tak naprawdę nie jest automatyczne.
David