Znaczenie funkcji w scikit-learn Random Forest wykazuje bardzo wysokie odchylenie standardowe

13

Używam scikit-learn Random Forest Classifier i chcę wykreślić znaczenie funkcji, tak jak w tym przykładzie .

Jednak mój wynik jest zupełnie inny, w tym sensie, że odchylenie standardowe ważności cechy jest prawie zawsze większe niż samo znaczenie znaczenia (patrz załączony obraz).

znaczenie funkcji

Czy możliwe jest takie zachowanie, czy też popełniam błędy przy jego planowaniu?

Mój kod jest następujący:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()
gc5
źródło
IIUC, predictorszwraca numpy arrayodniesienie do pandas Dataframeobiektu według jego kolumn, co jest niepoprawne, ponieważ numpy arraysnie ma atrybutu columns.
Nickil Maveli,
Przepraszamy, to była literówka w kodzie. predyktory i wynik są dwa pandas DataFramez kształtem m x ni m x 1. Teraz powinno być jasne.
gc5,
2
Jakiś czas temu spotkałem te same ustalenia. Być może wynika to z faktu, że wiele cech jest ważnych, ale ponieważ cechy mogą być wysokie lub niskie w drzewie decyzyjnym (ponieważ przy tworzeniu podziału oferowany jest tylko losowy podzbiór), ich znaczenie różni się znacznie w zależności od drzewa drzewo, co powoduje wysokie odchylenie standardowe.
Archie,
Świetny post, napotkałem identyczny problem, jak widać na zdjęciu. Istnieje pakiet, tsfreshktóry pomógł mi zidentyfikować odpowiednie funkcje i zmniejszyć moje funkcje z 600+ do około 400. ! [Moje 35 najlepszych funkcji ] ( i.stack.imgur.com/0MROZ.png ) Mimo to algorytm działa dobrze dla mnie. Mam klasyfikację binarną, sukces / porażka. Praktycznie nie odnoszę żadnych fałszywych sukcesów, ale brakuje mi sporego procentu sukcesu. Wszystkie powyższe domysły wydają się rozsądne. Może się zdarzyć, że potrzebny będzie większy zestaw szkoleń i testów. Mam mniej
superbohatera

Odpowiedzi:

3

Używasz RandomForest z domyślną liczbą drzew, która wynosi 10. Dla około 30 funkcji jest to za mało. Dlatego odchylenie standardowe jest duże. Wypróbuj co najmniej 100, a nawet 1000 drzew

clf = RandomForestClassifier(n_estimators=1000)

Aby uzyskać bardziej szczegółową analizę, możesz również sprawdzić, jak duża jest korelacja między Twoimi funkcjami.

lanenok
źródło
Niestety lanenok, liczba drzew nie jest domyślna. Podaję przykładowy kod (i dotyczy to wszystkich parametrów, np. min_samples_split), Ponieważ nie mogę ujawnić danych, nad którymi pracuję. Czy jednak wynika to z liczby drzew i innych parametrów, czy popełniam tutaj błędy?
gc5,
2

Twój wynik nie jest taki dziwny. Jak stwierdza lanenok , w pierwszym kroku powinieneś zwiększyć liczbę drzew, aby mieć pewność, że uzyskasz „statystyczny” wynik dotyczący ważności cech.

Jednakże, jak ten artykuł Genuer i in. (2010) pokazuje, że można faktycznie użyć standardowych odchyleń w celu wyeliminowania funkcji. Cytując: „ Widzimy, że odchylenie standardowe zmiennych prawdziwych jest duże w porównaniu do wariantu szumów, który jest bliski zeru ”.

Archie
źródło
Zastosowanie odchylenia standardowego w tym przykładzie do wyeliminowania funkcji wyeliminowałoby wszystkie funkcje. xD
Jorge Leitao,
Haha, nie jestem do końca pewien, myślę, że możesz bezpiecznie odrzucić funkcje po prawej stronie? W każdym razie, głównym punktem, który staram się podnieść, jest to, że wysokie odchylenia standardowe nie są tak dziwne i że można ich użyć w swojej strategii, aby wyeliminować funkcje.
Archie,
1

Spróbować clf = RandomForestClassifier(max_features=None). max_featuresParam domyślnie 'auto', co odpowiada sqrt(n_features). max_featuresjest opisany jako „Liczba funkcji, które należy wziąć pod uwagę, szukając najlepszego podziału”. Patrząc tylko na niewielką liczbę funkcji w dowolnym punkcie drzewa decyzyjnego, znaczenie pojedynczej cechy może się znacznie różnić w wielu drzewach. Więc nie patrz na losowy podzbiór, po prostu spójrz na wszystkie funkcje na każdym poziomie drzewa.

jamis
źródło
1
Zauważ, że jest to odpowiednik zwykłych drzew w workach. „Losowy” w losowych lasach oznacza rozważenie losowego podzbioru cech przy każdym podziale, zwykle sqrt(n_features)lub log2(n_features). max_features=Nonenie uwzględnia już losowego podzbioru funkcji. Nie jestem pewien, czy to wpłynie na zaproponowane powyżej rozwiązanie. Jedną z możliwości jest to, że wiele funkcji ma po prostu duże znaczenie i dlatego różnią się znacznie w zależności od zespołu drzew. A może nie ma wystarczającej liczby próbek, więc nie każda funkcja jest brana pod uwagę, zanim trafisz na liść.
jamis
1

Częstą przyczyną tego jest to, że parametry, które podałeś (lub których domyślnie użyłeś) RandomForestClassifiernie są odpowiednie dla twojego zestawu danych.

Częstym sposobem rozwiązania tego problemu jest przeszukiwanie przestrzeni hiperparametrów za pomocą np . GridSearchCV:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_gridoto permutacje parametrów, które chcesz wyszukać, i make_scorer(accuracy_score)miara, którą chcesz zoptymalizować.

Należy pamiętać, że accuracy_scorejest odpowiedni dla zestawów zrównoważonych, ale nie dla zestawów niezrównoważonych. Wybierz odpowiednią metrykę dla swojego konkretnego celu.

Jorge Leitao
źródło
0

Może być wiele przyczyn. Liczba drzew i głębokość mogą zmienić twoje wyniki. Jeśli twój model nie działa dobrze po wybraniu parametrów (walidacja krzyżowa itp.), To prawdopodobnie dlatego, że twoje funkcje nie są bardzo predykcyjne, więc są wybierane prawie „losowo”, co prowadzi do wysokich odchyleń standardowych od drzewa do drzewa. Ale są też inne możliwości, np. Może się zdarzyć, że twoje funkcje są wysoce skorelowane. Przydałoby się trochę więcej informacji.

oW_
źródło