2013-04-04 7 views
57

Ho un compito di classificazione con una serie temporale come input di dati, in cui ogni attributo (n = 23) rappresenta un punto specifico nel tempo. Oltre al risultato della classifica assoluta vorrei sapere quali attributi/date contribuiscono al risultato fino a che punto. Quindi sto usando il feature_importances_, che funziona bene per me.Come vengono determinate feature_importances in RandomForestClassifier?

Tuttavia, mi piacerebbe sapere come vengono calcolati e quale misura/algoritmo viene utilizzato. Purtroppo non sono riuscito a trovare alcuna documentazione su questo argomento.

+5

Devo tre core dev in uno thread SO. Dev'essere una specie di registrazione ^^ –

risposta

8

È il rapporto tra il numero di campioni instradati a un nodo decisionale che coinvolge tale funzione in uno degli alberi dell'insieme sul numero totale di campioni nel set di allenamento.

Le funzioni coinvolte nei nodi di livello superiore degli alberi decisionali tendono a visualizzare più campioni, pertanto è probabile che abbiano più importanza.

Modifica: questa descrizione è solo parzialmente corretta: le risposte di Gilles e Peter sono la risposta corretta.

+1

Sai se c'è qualche documento/documentazione sul metodo esatto? per esempio. Breiman, 2001. Sarebbe bello se avessi un documento adeguato, che potrei citare per la metodologia. – user2244670

+0

@ogrisel sarebbe bello se si potesse chiaramente contrassegnare la risposta come la spiegazione per la "ponderazione". La ponderazione da sola non determina l'importanza della funzione. La "metrica dell'impicurazione" ("gini-importanza" o RSS) combinata con i pesi, mediata sugli alberi determina l'importanza complessiva della funzione. Sfortunatamente la documentazione su scikit-imparare qui: http://scikit-learn.org/stable/modules/ensemble.html#feature-importance-valutazione non è accurata e menziona erroneamente "profondità" come la metrica dell'impurità. – Ariel

34

Il modo usuale per calcolare i valori di importanza di un singolo albero è la seguente:

  1. si inizializza un array feature_importances di tutti zeri con dimensioni n_features.

  2. si attraversa l'albero: per ogni nodo interno che divide in funzione i si calcola la riduzione degli errori di quel nodo, moltiplicato per il numero di campioni che sono stati indirizzati al nodo e aggiungere questa quantità di feature_importances[i].

La riduzione dell'errore dipende dal criterio di impurità che si utilizza (ad esempio Gini, Entropy, MSE, ...). È l'impurità dell'insieme di esempi che viene instradato al nodo interno meno la somma delle impurità delle due partizioni create dalla divisione.

È importante che questi valori siano relativi a un set di dati specifico (sia la riduzione dell'errore che il numero di campioni sono specifici del set di dati), pertanto questi valori non possono essere confrontati tra diversi set di dati.

Per quanto ne so, esistono modi alternativi per calcolare i valori di importanza delle caratteristiche negli alberi decisionali. Una breve descrizione del metodo sopra può essere trovata in "Elements of Statistical Learning" di Trevor Hastie, Robert Tibshirani e Jerome Friedman.

+0

Quali sono esattamente le impurità quando si tratta di alberi decisionali? –

93

Esistono infatti diversi modi per ottenere le "importazioni" di funzionalità. Come spesso, non c'è un consenso stretto su cosa significhi questa parola.

In scikit-learn, implementiamo l'importanza come descritto in [1] (spesso citato, ma sfortunatamente letto ...). Viene talvolta chiamato "importanza gini" o "impurità di diminuzione media" ed è definito come la diminuzione totale dell'impurità del nodo (ponderata dalla probabilità di raggiungere quel nodo (che è approssimato dalla proporzione di campioni che raggiungono quel nodo)) mediata su tutti alberi del complesso.

Nella documentazione o in altri pacchetti, è anche possibile trovare importanze di funzionalità implementate come "precisione di diminuzione media". Fondamentalmente, l'idea è di misurare la diminuzione dell'accuratezza dei dati OOB quando permuti a caso i valori per quella caratteristica. Se la diminuzione è bassa, la funzione non è importante e viceversa.

(Si noti che entrambi gli algoritmi sono disponibili nel pacchetto foresta casuale R.)

[1]: Breiman, Friedman, "Classificazione e alberi di regressione", 1984.

+30

Potrebbe essere bello se questa risposta fosse menzionata nella documentazione degli attributi/esempi di importanza. Lo sto cercando da un po ':) – d1337

+2

Sembra che il punteggio di importanza sia in valore relativo? Ad esempio, la somma dei punteggi di importanza di tutte le funzionalità è sempre 1 (vedere l'esempio qui http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html#example-ensemble-plot-forest-importances- py) – RNA

+5

@RNA: Sì, per impostazione predefinita le importazioni delle variabili sono normalizzate in scikit-learn, in modo tale che sommano a uno. Puoi aggirare questo aggirando i singoli stimatori di base e chiamando 'tree_.compute_feature_importances (normalize = False)'. –

4

Come @GillesLouppe indicato sopra, scikit-learn implementa attualmente la metrica "impurità di diminuzione media" per le importazioni di funzionalità. Personalmente trovo la seconda metrica un po 'più interessante, dove permuti a caso i valori per ciascuna delle tue caratteristiche uno per uno e vedi quanto peggio è la tua performance fuori borsa.

Poiché ciò che cercate con l'importanza delle funzionalità è quanto ciascuna funzione contribuisce al rendimento predittivo del modello generale, la seconda metrica fornisce effettivamente una misura diretta di ciò, mentre la "media diminuzione dell'impurezza" è solo un buon proxy .

Se siete interessati, ho scritto un piccolo pacchetto che implementa l'importanza permutazione metrica e può essere utilizzato per calcolare i valori da un'istanza di una classe foresta casuale scikit-learn:

https://github.com/pjh2011/rf_perm_feat_import

Modifica: questo funziona per Python 2.7, non 3

+0

Ciao @Peter quando uso il tuo codice ottengo questo errore: NameError: nome 'xrange' non è definito. – Aizzaac

+0

Ciao @Aizzaac. Scusa se sono nuovo nello scrivere pacchetti, quindi avrei dovuto notare che l'ho scritto per Python 2.7. Prova def xrange (x): restituisci iter (range (x)) prima di eseguirlo – Peter

Problemi correlati