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).
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()
predictors
zwracanumpy array
odniesienie dopandas Dataframe
obiektu według jego kolumn, co jest niepoprawne, ponieważnumpy arrays
nie ma atrybutucolumns
.pandas DataFrame
z kształtemm x n
im x 1
. Teraz powinno być jasne.tsfresh
któ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 mniejOdpowiedzi:
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
Aby uzyskać bardziej szczegółową analizę, możesz również sprawdzić, jak duża jest korelacja między Twoimi funkcjami.
źródło
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?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 ”.
źródło
Spróbować
clf = RandomForestClassifier(max_features=None)
.max_features
Param domyślnie'auto'
, co odpowiadasqrt(n_features)
.max_features
jest 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.źródło
sqrt(n_features)
lublog2(n_features)
.max_features=None
nie 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ść.Częstą przyczyną tego jest to, że parametry, które podałeś (lub których domyślnie użyłeś)
RandomForestClassifier
nie są odpowiednie dla twojego zestawu danych.Częstym sposobem rozwiązania tego problemu jest przeszukiwanie przestrzeni hiperparametrów za pomocą np .
GridSearchCV
:param_grid
oto permutacje parametrów, które chcesz wyszukać, imake_scorer(accuracy_score)
miara, którą chcesz zoptymalizować.Należy pamiętać, że
accuracy_score
jest odpowiedni dla zestawów zrównoważonych, ale nie dla zestawów niezrównoważonych. Wybierz odpowiednią metrykę dla swojego konkretnego celu.źródło
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.
źródło