Mam zadanie klasyfikacyjne z szeregami czasowymi jako danymi wejściowymi, gdzie każdy atrybut (n = 23) reprezentuje określony punkt w czasie. Oprócz absolutnego wyniku klasyfikacji chciałbym się dowiedzieć, które atrybuty / daty wpływają na wynik w jakim stopniu. Dlatego używam tylko programu feature_importances_
, który działa dobrze dla mnie.
Chciałbym jednak wiedzieć, w jaki sposób są one obliczane i który środek / algorytm jest używany. Niestety nie mogłem znaleźć żadnej dokumentacji na ten temat.
scikit-learn
random-forest
feature-selection
user2244670
źródło
źródło
Odpowiedzi:
Rzeczywiście istnieje kilka sposobów uzyskania „ważności” funkcji. Jak to często bywa, nie ma ścisłej zgody co do znaczenia tego słowa.
W scikit-learn realizujemy znaczenie opisane w [1] (często cytowane, ale niestety rzadko czytane ...). Jest czasami nazywany „ważnością giniego” lub „średnim zmniejszeniem zanieczyszczeń” i jest definiowany jako całkowity spadek zanieczyszczenia węzła (ważony prawdopodobieństwem dotarcia do tego węzła (które jest przybliżone przez odsetek próbek docierających do tego węzła)) uśredniony dla wszystkich drzewa zespołu.
W literaturze lub w niektórych innych pakietach można również znaleźć znaczenia funkcji zaimplementowane jako „średni spadek dokładności”. Zasadniczo chodzi o zmierzenie spadku dokładności danych OOB, gdy losowo permutujesz wartości dla tej funkcji. Jeśli spadek jest niski, funkcja nie jest ważna i odwrotnie.
(Należy pamiętać, że oba algorytmy są dostępne w pakiecie randomForest R.)
[1]: Breiman, Friedman, „Drzewa klasyfikacji i regresji”, 1984.
źródło
tree_.compute_feature_importances(normalize=False)
.Typowy sposób obliczania wartości ważności cech w pojedynczym drzewie jest następujący:
inicjalizujesz tablicę
feature_importances
wszystkich zer o rozmiarzen_features
.przechodzisz przez drzewo: dla każdego węzła wewnętrznego, który dzieli się na obiekt
i
, obliczasz redukcję błędów tego węzła pomnożoną przez liczbę próbek, które zostały skierowane do węzła i dodajesz tę ilość dofeature_importances[i]
.Redukcja błędu zależy od kryterium zanieczyszczenia, którego używasz (np. Gini, Entropy, MSE, ...). Jest to zanieczyszczenie zestawu przykładów, które jest kierowane do węzła wewnętrznego pomniejszone o sumę zanieczyszczeń z dwóch partycji utworzonych przez podział.
Ważne jest, aby te wartości były odniesione do określonego zbioru danych (zarówno redukcja błędów, jak i liczba próbek są specyficzne dla zestawu danych), dlatego wartości te nie mogą być porównywane między różnymi zbiorami danych.
O ile mi wiadomo, istnieją alternatywne sposoby obliczania wartości ważności cech w drzewach decyzyjnych. Krótki opis powyższej metody można znaleźć w „Elements of Statistical Learning” Trevora Hastiego, Roberta Tibshirani i Jerome'a Friedmana.
źródło
Jest to stosunek liczby próbek skierowanych do węzła decyzyjnego obejmującego tę cechę w dowolnym z drzew zespołu do całkowitej liczby próbek w zbiorze uczącym.
Funkcje, które są zaangażowane w węzły najwyższego poziomu drzew decyzyjnych, zwykle zawierają więcej próbek, dlatego prawdopodobnie będą miały większe znaczenie.
Edycja : ten opis jest tylko częściowo poprawny: odpowiedzi Gillesa i Petera są poprawne.
źródło
Jak @GillesLouppe wskazał powyżej, scikit-learn obecnie implementuje metrykę „średniego spadku zanieczyszczeń” dla ważności funkcji. Osobiście uważam, że druga metryka jest nieco bardziej interesująca, w której losowo permutujesz wartości dla każdej funkcji jedna po drugiej i sprawdzasz, o ile gorsza jest wydajność po wyjęciu z torby.
Ponieważ tym, czego szukasz, jeśli chodzi o ważność funkcji, jest to, w jakim stopniu każda funkcja przyczynia się do ogólnej wydajności predykcyjnej twojego modelu, druga miara w rzeczywistości daje ci bezpośrednią miarę tego, podczas gdy „zanieczyszczenie średniego spadku” jest po prostu dobrym proxy.
Jeśli jesteś zainteresowany, napisałem mały pakiet, który implementuje metrykę Permutation Importance i może być używany do obliczania wartości z instancji losowej klasy lasu scikit-learn:
https://github.com/pjh2011/rf_perm_feat_import
Edycja: to działa dla Pythona 2.7, a nie 3
źródło
Spróbuję odpowiedzieć na pytanie. kod:
Działka drzewa decyzyjnego:
wprowadź opis obrazu tutaj.
Możemy uzyskać compute_feature_importance: [0. , 0.01333333,0.06405596,0.92261071]
Sprawdź kod źródłowy:
Spróbuj obliczyć ważność funkcji:
Otrzymujemy feature_importance: np.array ([0,1.332,6.418,92.30]).
Po znormalizowaniu możemy otrzymać tablicę ([0., 0.01331334, 0.06414793, 0.92253873]), to jest to samo co
clf.feature_importances_
.Uważaj, wszystkie klasy mają mieć wagę jeden.
źródło
Dla tych, którzy szukają odniesienia do dokumentacji scikit-learn na ten temat lub odniesienia do odpowiedzi @GillesLouppe:
W RandomForestClassifier
estimators_
atrybut jest listą DecisionTreeClassifier (jak wspomniano w dokumentacji ). Aby obliczyćfeature_importances_
dla RandomForestClassifier, w kodzie źródłowym scikit-learn uśrednia wszystkiefeature_importances_
atrybuty estymatora (wszystkie DecisionTreeClassifer) w zespole.W dokumentacji DecisionTreeClassifera wspomina się, że „Ważność cechy jest obliczana jako (znormalizowana) całkowita redukcja kryterium wynikającego z tej cechy. Znana jest również jako znaczenie Giniego [1]”.
Tutaj jest bezpośredni link do dalszych informacji na temat zmiennych i ważności Gini, zgodnie z odnośnikiem scikit-learn poniżej.
[1] L. Breiman i A. Cutler, „Random Forests”, http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
źródło