L'importanza delle funzionalità con Scikit-learn Random Forest mostra una deviazione standard molto elevata


13

Sto usando Scikit-learn Random Forest Classifier e voglio tracciare l'importanza delle funzionalità come in questo esempio .

Tuttavia, il mio risultato è completamente diverso, nel senso che l'importanza della deviazione standard è quasi sempre maggiore dell'importanza della caratteristica stessa (vedi immagine allegata).

importanza della caratteristica

È possibile avere questo tipo di comportamento, o sto facendo degli errori durante la trama?

Il mio codice è il seguente:

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()

IIUC, predictorsrestituisce un oggetto a numpy arraycui si fa riferimento a un pandas Dataframeoggetto dalle sue colonne, che è errato in quanto numpy arraysnon dispongono dell'attributo columns.
Nickil Maveli,

Siamo spiacenti, era un errore di battitura sul codice. i predittori e il risultato sono due pandas DataFramecon forma m x ne m x 1. Dovrebbe essere chiaro ora.
gc5,

2
Ho trovato gli stessi risultati qualche tempo fa. Potrebbe essere che ciò sia dovuto al fatto che un certo numero di funzioni sono importanti, ma poiché le funzioni possono essere alte o basse nell'albero decisionale (poiché solo un sottoinsieme casuale viene offerto quando si effettua una divisione), la loro importanza varia notevolmente da albero a albero, che si traduce in una deviazione standard elevata.
Archie,

Ottimo post, ho riscontrato un problema identico come puoi vedere nella foto. Esiste un pacchetto tsfreshche mi ha aiutato a identificare le funzionalità pertinenti e a tagliare le mie funzionalità da 600+ a circa 400. ! [Le mie prime 35 funzionalità ] ( i.stack.imgur.com/0MROZ.png ) Anche con questo l'algoritmo funziona bene per me. Ho una classificazione binaria, successo / fallimento. Non ottengo praticamente falsi successi, ma mi manca una percentuale considerevole di successo. Tutte le ipotesi sopra sembrano ragionevoli. Potrebbe essere necessario un set di addestramento e test più ampio. Ne ho meno
supereroe il

Risposte:


3

Stai usando RandomForest con il numero predefinito di alberi, che è 10. Per circa 30 funzionalità questo è troppo pochi. Pertanto la deviazione standard è grande. Prova almeno 100 o anche 1000 alberi, come

clf = RandomForestClassifier(n_estimators=1000)

Per un'analisi più raffinata puoi anche verificare quanto è grande la correlazione tra le tue funzionalità.


Siamo spiacenti lanenok, il numero di alberi non è quello predefinito. Ho inserito un codice di esempio (e questo vale per tutti i parametri, ad es. min_samples_split) Perché non posso rivelare i dati su cui sto lavorando. Tuttavia, è dovuto al numero di alberi, oltre ad altri parametri, o sto facendo degli errori qui?
gc5,

2

Il tuo risultato non è poi così strano. Come afferma Lanenok , in una prima fase dovresti aumentare il numero di alberi per assicurarti di ottenere un risultato "statistico" relativo all'importanza delle caratteristiche.

Tuttavia, come questo articolo di Genuer et al. (2010) mostra che puoi effettivamente utilizzare le deviazioni standard per eliminare le funzionalità. Per citare: " Possiamo vedere che la deviazione standard delle variabili vere è grande rispetto a quella delle variabili rumorose, che è vicina allo zero " .


L'uso della deviazione standard in questo esempio per eliminare le funzionalità eliminerebbe tutte le funzionalità. xD
Jorge Leitao,

Haha, non sono del tutto sicuro, penso che potresti scartare in sicurezza le funzionalità all'estrema destra? Ad ogni modo, il punto principale che sto cercando di sottolineare è che le deviazioni standard elevate non sono così strane e che puoi effettivamente usarle nella tua strategia per eliminare le funzionalità.
Archie,

1

Prova clf = RandomForestClassifier(max_features=None). Il max_featuresparametro predefinito 'auto'è equivalente a sqrt(n_features). max_featuresè descritto come "Il numero di funzioni da considerare quando si cerca la migliore suddivisione". Osservare solo un numero limitato di funzioni in qualsiasi punto dell'albero decisionale significa che l'importanza di una singola funzione può variare ampiamente tra molti alberi. Quindi, non guardare un sottoinsieme casuale, basta guardare tutte le caratteristiche ad ogni livello dell'albero.


1
Nota che questo è l'equivalente di semplici alberi insaccati. Il "casuale" nelle foreste casuali significa considerare un sottoinsieme casuale di caratteristiche ad ogni divisione, di solito sqrt(n_features)o log2(n_features). max_features=Nonenon considera più un sottoinsieme casuale di funzionalità. Non sono sicuro che ciò influisca sulla soluzione proposta sopra. Una possibilità è che molte caratteristiche hanno semplicemente una grande quantità di importanza e quindi variano ampiamente all'interno dell'insieme di alberi. O forse non ci sono abbastanza campioni e quindi non tutte le funzionalità vengono prese in considerazione quando si colpisce una foglia.
Jamis,

1

Un motivo comune per questo è che i parametri forniti (o predefiniti) RandomForestClassifiernon sono adatti al set di dati.

Un modo comune per affrontare questo problema è cercare nello spazio dell'iperparametro usando ad esempio 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_gridecco le permutazioni dei parametri in cui si desidera cercare e make_scorer(accuracy_score)la misura che si desidera ottimizzare.

Si noti che accuracy_scoreè adatto per set bilanciati, ma non per set non bilanciati. Scegli una metrica adatta per il tuo obiettivo particolare.


0

Potrebbero esserci più ragioni. Il numero di alberi e la profondità possono modificare i risultati. Se il tuo modello non funziona bene dopo aver selezionato i parametri (convalida incrociata ecc.), È probabilmente perché le tue caratteristiche non sono molto predittive, quindi vengono scelte quasi "casualmente" che porta a deviazioni standard elevate da un albero all'altro. Ma ci sono altre possibilità, ad esempio potrebbe anche essere che le tue funzionalità siano altamente correlate. Un po 'più di informazioni sarebbero utili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.