2015-07-08 17 views
6

Sto provando a prevedere una variabile binaria con entrambe le foreste casuali e la regressione logistica. Ho classi molto squilibrate (circa l'1,5% di Y = 1).Importanza delle caratteristiche della base AUC utilizzando Foresta casuale

Le tecniche caratteristica importanza di default in foreste casuali si basano sulla precisione di classificazione (tasso di errore) - che ha dimostrato di essere una cattiva misura per le classi sbilanciato (vedi here e here).

I due VIM standard per la selezione delle funzioni con RF sono Gini VIM e permutazione VIM. In parole povere, Gini VIM di un predittore di interesse è la somma sulla foresta delle diminuzioni di impurità di Gini generate da questo predittore ogni volta che è stato selezionato per la divisione, scalato in base al numero di alberi.

La mia domanda è: è quel tipo di metodo implementato in scikit-learn (come nel pacchetto R party)? O forse una soluzione?

PS: Questa domanda è un po 'collegata con an other.

risposta

3

Dopo aver fatto alcuni researchs, questo è quello che è venuto fuori con:

from sklearn.cross_validation import ShuffleSplit 
from collections import defaultdict 

names = db_train.iloc[:,1:].columns.tolist() 

# -- Gridsearched parameters 
model_rf = RandomForestClassifier(n_estimators=500, 
           class_weight="auto", 
           criterion='gini', 
           bootstrap=True, 
           max_features=10, 
           min_samples_split=1, 
           min_samples_leaf=6, 
           max_depth=3, 
           n_jobs=-1) 
scores = defaultdict(list) 

# -- Fit the model (could be cross-validated) 
rf = model_rf.fit(X_train, Y_train) 
acc = roc_auc_score(Y_test, rf.predict(X_test)) 

for i in range(X_train.shape[1]): 
    X_t = X_test.copy() 
    np.random.shuffle(X_t[:, i]) 
    shuff_acc = roc_auc_score(Y_test, rf.predict(X_t)) 
    scores[names[i]].append((acc-shuff_acc)/acc) 

print("Features sorted by their score:") 
print(sorted([(round(np.mean(score), 4), feat) for 
       feat, score in scores.items()], reverse=True)) 

Features sorted by their score: 
[(0.0028999999999999998, 'Var1'), (0.0027000000000000001, 'Var2'), (0.0023999999999999998, 'Var3'), (0.0022000000000000001, 'Var4'), (0.0022000000000000001, 'Var5'), (0.0022000000000000001, 'Var6'), (0.002, 'Var7'), (0.002, 'Var8'), ...] 

L'uscita non è molto sexy, ma si è venuta l'idea. La debolezza di questo approccio è che l'importanza della funzione sembra essere molto dipendente dai parametri. L'ho eseguito utilizzando diversi parametri (max_depth, max_features ..) e sto ottenendo risultati molto diversi. Così ho deciso di eseguire una ricerca di griglie sui parametri (scoring = 'roc_auc') e quindi applicare questo VIM (Variable Importance Measure) al modello migliore.

Mi sono ispirato a questo (ottimo) notebook.

Tutti i suggerimenti/commenti sono i benvenuti!

+0

Grazie per aver condiviso l'ultimo link. – Simone

3

scoring è solo uno strumento di valutazione delle prestazioni utilizzato nel campione di prova e non entra nell'unità interna DecisionTreeClassifier ad ogni nodo di divisione. È possibile specificare solo il criterion (tipo di funzione di perdita interna su ciascun nodo di divisione) come gini o information entropy per l'albero algo.

scoring può essere utilizzato in un contesto di convalida incrociata in cui l'obiettivo è di ottimizzare alcuni iperparametri (come max_depth). Nel tuo caso, puoi utilizzare uno GridSearchCV per ottimizzare alcuni dei tuoi hyperparameters utilizzando la funzione di calcolo del punteggio roc_auc.

+0

Ho modificato la mia domanda iniziale che era confusa (perché ero io stesso). Spero sia più chiaro ora !. –

Problemi correlati