2013-04-04 11 views
57

Mam zadanie klasyfikacji z szeregiem czasowym jako dane wejściowe, 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 przyczyniają się do wyniku w jakim zakresie. Dlatego używam tylko feature_importances_, który działa dobrze dla mnie.W jaki sposób ustalane są ratio_manualności w RandomForestClassifier?

Chciałbym jednak wiedzieć, w jaki sposób są obliczane i jaki pomiar/algorytm jest używany. Niestety nie mogłem znaleźć żadnej dokumentacji na ten temat.

+5

Woah trzy podstawowe programistów w jednym wątku SO. To musi być jakaś płytka ^^ –

Odpowiedz

8

Jest to stosunek liczby próbek kierowanych do węzła decyzyjnego obejmującego tę funkcję w dowolnym drzewku zespołu w stosunku do całkowitej liczby próbek w zbiorze treningowym.

Funkcje, które są zaangażowane w węzły najwyższego poziomu drzew decyzyjnych, mają tendencję do dostrzegania większej liczby próbek, dlatego mogą mieć większe znaczenie.

Edytuj: ten opis jest tylko częściowo poprawny: odpowiedzi Gillesa i Petera są poprawną odpowiedzią.

+1

Czy wiesz, jeśli jest jakiś papier/dokumentacja na temat dokładnej metody? na przykład. Breiman, 2001. Byłoby wspaniale, gdybym miał jakiś stosowny dokument, który mógłbym przytoczyć dla metodologii. – user2244670

+0

@ogrisel byłoby wspaniale, gdybyś mógł wyraźnie zaznaczyć swoją odpowiedź jako wyjaśnienie "ważenia". Sam ważenie nie określa ważności funkcji. "Metryka zanieczyszczenia" ("gini-important" lub RSS) w połączeniu z wagami uśrednionymi na drzewach określa ogólną ważność funkcji. Niestety dokumentacja na scikit-learn tutaj: http://scikit-learn.org/stable/modules/ensemble.html#feature-importance-evaluation nie jest dokładna i niepoprawnie wymienia "głębokość" jako metrykę nieczystości. – Ariel

34

Zwykłym sposobem obliczania wartości funkcji wagę jednego drzewa jest następujący:

  1. zainicjować tablicę feature_importances wszystkich zer o rozmiarze n_features.

  2. Ci przemierzać drzewa: dla każdego węzła wewnętrznego, który dzieli się na funkcji i obliczyć redukcję błędów tego węzła pomnożonej przez liczbę próbek, które były kierowane do węzła i dodać tę ilość do feature_importances[i].

Zmniejszenie błędu zależy od zastosowanego kryterium zanieczyszczenia (np. Gini, Entropy, MSE, ...). Jest to zanieczyszczenie zestawu przykładów, które jest kierowane do węzła wewnętrznego minus suma zanieczyszczeń z dwóch partycji utworzonych przez podział.

Ważne jest, aby te wartości odnosiły się do określonego zestawu danych (zarówno zmniejszenie błędu, jak i liczba próbek są specyficzne dla zestawu danych), dlatego tych wartości nie można porównywać między różnymi zestawami danych.

O ile mi wiadomo, istnieją alternatywne sposoby obliczania wartości ważności funkcji w drzewach decyzyjnych. Krótki opis powyższej metody można znaleźć w "Elementach statystycznego uczenia się" autorstwa Trevora Hastie, Roberta Tibshirani i Jerome'a ​​Friedmana.

+0

Co to są zanieczyszczenia dokładnie podczas pobierania na drzewach decyzyjnych? –

93

Istnieje kilka sposobów na uzyskanie funkcji "importu". Jak często nie ma ścisłego porozumienia co do tego, co oznacza to słowo.

W nauce o scikitach wdrażamy znaczenie opisane w [1] (często cytowane, ale niestety rzadko czytamy ...). Czasami określa się go mianem "znaczenia gini" lub "średniego zmniejszenia zanieczyszczenia" i określa się go jako całkowity spadek zanieczyszczenia węzłów (ważony prawdopodobieństwem dotarcia do tego węzła (który jest przybliżony przez proporcję 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źć importowane funkcje jako "średnia dokładność zmniejszania". Zasadniczo chodzi o pomiar 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 zauważyć, że obydwa algorytmy są dostępne w pakiecie lasy losowe r.)

[1]: Breiman Friedman, "Klasyfikacja i drzewa regresji", 1984.

+30

Może być świetnie, jeśli ta odpowiedź została wspomniana w dokumentacji ważniejszych atrybutów/przykładu. Szukałem go również przez chwilę :) – d1337

+2

Wygląda na to, że ocena ważności ma wartość względną? Na przykład suma wyników ważności wszystkich funkcji wynosi zawsze 1 (zobacz przykład tutaj: http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html#example-ensemble-plot-forest-importances- py) – RNA

+5

@RNA: Tak, domyślnie zmienne ważenia są znormalizowane w nauce scikit, tak że sumują się do jednego. Można to obejść poprzez zapętlenie poszczególnych estymatorów bazowych i wywołanie 'tree_.compute_feature_importances (normalize = False)'. –

4

@GillesLouppe Jak wskazano powyżej, scikit-learn obecnie implementuje miarę "średnie zmniejszenie nieczystości" dla importowanych funkcji. Osobiście uważam, że drugi wskaźnik jest nieco bardziej interesujący, w którym losowo zmienia się wartości każdej z funkcji jeden po drugim i widzisz, o ile gorsza jest wydajność poza bagażem.

Od tego, do czego dążysz, ważne jest to, ile każda z funkcji przyczynia się do predykcyjnej wydajności całego modelu, druga miara daje ci bezpośrednią miarę tego, natomiast "średnia redukcja nieczystości" jest po prostu dobrą wartością zastępczą .

Jeśli jesteś zainteresowany, napisałem mały pakiet, który implementuje znaczenie permutacja metryczny i mogą być wykorzystane do obliczenia wartości z instancji klasy losowej leśnej scikit-learn:

https://github.com/pjh2011/rf_perm_feat_import

Edytuj: Działa to dla Pythona 2.7, a nie 3

+0

Hi @Peter, gdy używam twojego kodu, otrzymuję ten błąd: NameError: name 'xrange' nie jest zdefiniowany. – Aizzaac

+0

Witam @Aizzaac. Przepraszam, że jestem nowy w pisaniu pakietów, więc powinienem był zauważyć, że napisałem to dla Pythona 2.7. Spróbuj def xrange (x): zwróć iter (zakres (x)) przed uruchomieniem go – Peter

Powiązane problemy