Metodo di punteggio OOB RandomForestClassifier


16

L'implementazione casuale della foresta in scikit-learn utilizza l'accuratezza media come metodo di calcolo del punteggio per stimare l'errore di generalizzazione con campioni out-of-bag? Questo non è menzionato nella documentazione, ma il metodo score () riporta l'accuratezza media.

Ho un set di dati altamente sbilanciato e sto usando AUC di ROC come metrica di punteggio nella ricerca della griglia. C'è un modo per dire al classificatore di usare lo stesso metodo di punteggio anche sui campioni OOB?


L'oob_score parametro del RandomForestClassifier classe non fare quello che vuoi?
Pierre,

AFAIK, oob_scoresegnala l'accuratezza. Tuttavia, devo rivedere il codice sorgente.
darXider,

Quale parametro stai stimando con la tua ricerca in griglia?
JahKnows,

^ Mi spiace, ma non mi ricordo proprio ora! Ho fatto questa domanda 1,5 anni fa.
darXider,

Risposte:


14

In generale, le prestazioni dei classificatori vengono confrontate usando l'accuratezza, questa è una misura del numero di istanze correttamente classificate diviso per il numero totale di istanze. Tuttavia, dai dati di addestramento possiamo ottenere una migliore approssimazione dell'errore atteso dal nostro classificatore quando utilizziamo tecniche di apprendimento o insaccamento di ensemble.

Errore esaurito

Questa metrica è l'accuratezza degli esempi usando tutti gli alberi nell'insieme di foreste casuali per i quali è stato omesso durante l'allenamento. Quindi in qualche modo si comporta come un'istanza di semi-test. Puoi avere un'idea di quanto bene il tuo classificatore possa generalizzare usando questa metrica.xi

Per implementare oob in sklearn è necessario specificarlo quando si crea l'oggetto Random Forests come

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Quindi possiamo addestrare il modello

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Punteggio: 0.979921928817

Come previsto, l'accuratezza del modello durante la valutazione del set di addestramento è molto elevata. Tuttavia, questo è insignificante perché si può benissimo sovrastimare i dati e quindi il modello è spazzatura. Tuttavia, possiamo usare il punteggio out-of-bag come

print(forest.oob_score_)

,86453272101

Questa è l'accuratezza durante la valutazione delle nostre istanze nel set di addestramento utilizzando solo gli alberi per i quali sono stati omessi. Ora calcoliamo il punteggio sul set di test come

print('Score: ', forest.score(X_test, y_test))

Punteggio: 0,86517733935

Vediamo che l'accuratezza misurata da oob è molto simile a quella ottenuta con il set di test. Ne consegue quindi la teoria secondo cui l'accuratezza del oob è una metrica migliore in base alla quale valutare le prestazioni del modello piuttosto che solo il punteggio. Questa è una conseguenza dei modelli di insaccamento e non può essere eseguita con altri tipi di classificatori.

Calcolo di oob utilizzando metriche diverse

Si, puoi fare questo! Tuttavia, dipende da come è strutturato esattamente il tuo codice. Non sono sicuro di come sia possibile includere il piano di cottura e l'AUC insieme alla cross_val_scorefunzione. Tuttavia, se si eseguono manualmente le pieghe di convalida incrociata, è possibile effettuare le seguenti operazioni, l'algoritmo di foreste casuali in sklearn fornisce la funzione decisionale di oob come

print(forest.oob_decision_function_)

La classe può quindi essere ottenuta usando

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Quindi possiamo calcolare l'AUC usando quanto segue

metrics.roc_auc_score(y_train, pred_train)

,86217157846471204


4
Grazie! Sono a conoscenza di come funziona il processo OOB in foreste casuali. Stavo chiedendo in particolare se è RandomForestClassifierpossibile restituire un punteggio OOB NON preciso e la seconda parte della risposta fornisce un ottimo suggerimento su come affrontare questo problema. Tuttavia, devo sottolineare che non si dovrebbero usare le etichette di classe per calcolare l'AUC della curva ROC; piuttosto, le probabilità della classe dovrebbero essere usate direttamente. Quindi, la definizione corretta sarebbe pred_train = forest.oob_decision_function_[:, 1].
darXider,

@darXider Non è così ombroso, poiché forest.oob_decision_function_.shape [0] == X_train.shape [0], mentre mi aspetterei che sia == numero di campioni OOB, che dovrebbe essere inferiore al numero di campioni in X_train? Inoltre, personalmente ero interessato a calcolare la perdita di log, anche per gli altri che vogliono farlo, penso che pred_train dovrebbe essere invece = forest.oob_decision_function_.
Sander Vanden Hautte,
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.