Come interpretare la matrice OOB e confusione per la foresta casuale?


35

Ho ricevuto uno script R da qualcuno per eseguire un modello di foresta casuale. L'ho modificato ed eseguito con alcuni dati dei dipendenti. Stiamo cercando di prevedere separazioni volontarie.

Ecco alcune informazioni aggiuntive: questo è un modello di classificazione dove 0 = dipendente è rimasto, 1 = dipendente è terminato, al momento stiamo esaminando solo una dozzina di variabili predittive, i dati sono "sbilanciati" in quanto i termini del record costituiscono circa 7 % del set di record totale.

Gestisco il modello con varie selezioni di mtry e ntree ma mi sono sistemato sul seguito. L'OOB è del 6,8%, che ritengo sia buono, ma la matrice di confusione sembra raccontare una storia diversa per la previsione dei termini poiché il tasso di errore è piuttosto elevato al 92,79%. Ho ragione nel ritenere di non poter fare affidamento su questo modello e utilizzarlo perché l'alto tasso di errore per la previsione dei termini? o c'è qualcosa che posso fare anche per usare la RF e ottenere un tasso di errore più piccolo per prevedere i termini?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908

Risposte:


20

La matrice di confusione viene calcolata in un punto specifico determinato dalla soglia dei voti. A seconda delle tue esigenze, ad es. Migliore precisione (riduzione dei falsi positivi) o migliore sensibilità (riduzione dei falsi negativi) potresti preferire un taglio diverso.

A tal fine, consiglio di tracciare (i) una curva ROC , (ii) una precisione di richiamo e (iii) una curva di calibrazione per selezionare il valore di taglio più adatto ai propri scopi. Tutti questi possono essere facilmente tracciati utilizzando le 2 seguenti funzioni della libreria ROCR R (disponibile anche su CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Per esempio:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);

Sono interessato alla tua risposta, ho tracciato con il codice che hai condiviso. mi darai per favore alcune risorse per trovare un po 'di dettagli sulla trama che hai suggerito. o scriverò alcune frasi su come interpretarlo. Molte grazie in anticipo.
MKS,

Ti suggerisco di iniziare con la voce per la curva ROC collegata a sopra e altre voci menzionate lì.
Itamar,

La risposta non affronta direttamente la limitazione dell'albero decisionale in un set di dati fortemente distorto.
SmallChess,

19

Il tuo set è nettamente sbilanciato - la RF di solito fallisce in questo scenario (cioè predice bene solo la classe più grande).

Dovresti provare a bilanciare il tuo set campionando la classe "0" solo per avere circa le stesse dimensioni della classe "1" o giocando con il classwtparametro.


1
Nonostante ci sia un classwtparametro, non penso che sia ancora implementato nella randomForest()funzione del randomForestpacchetto in R. Per Link . L'hai mai usato prima? L'ho provato con valori diversi ma ho ottenuto risultati identici al valore predefinito classwt=NULL.
Zhubarb,

9

Sulla base della tua matrice di confusione, hai 5.908 punti dati e la stragrande maggioranza di essi sono di tipo 0 ("dipendente rimasto"). Il classificatore può quindi cavarsela con l'essere "pigro" e scegliere la classe di maggioranza a meno che non sia assolutamente certo che un esempio appartenga all'altra classe. Nota che il tuo tasso di errore complessivo è ~ 7%, che è abbastanza vicino alla percentuale di esempi di Class1!

Hai alcune opzioni:

  • Elimina gli esempi di Class0 fino a quando non hai classi approssimativamente bilanciate. Non so se ci sia letteratura su come scegliere un sottoinsieme perfettamente rappresentativo (forse qualcun altro può pesare?), Ma potresti iniziare facendo cadere esempi a caso. Puoi passare un subsetargomento a randomForest, il che dovrebbe renderlo banale da testare.

  • Regola i pesi della tua funzione / classe di perdita per compensare il numero sproporzionato di Classe0. In sostanza, si desidera rendere molto più costoso per il classificatore classificare erroneamente un esempio di Class1 rispetto a quello di Class0. Potrebbe avere senso provare Class0 = 1 / 0,07 ~ = 14x Class1 per iniziare, ma potresti voler regolare questo in base alle tue esigenze aziendali (quanto peggio è un tipo di errore). Penso che il classwtparametro sia quello che stai cercando qui.

  • Usa il campionamento stratificato per assicurarti di avere esempi di entrambe le classi nei dati di allenamento degli alberi. È possibile che alcuni dei tuoi alberi siano stati addestrati solo su dati di Classe 0, il che ovviamente farà presagire male per le loro prestazioni di generalizzazione. Dai un'occhiata strataall'argomento.


La selezione casuale dalla classe dominante suona ragionevole. Non devono essere uguali: anche un rapporto 1: 5 dovrebbe essere un miglioramento.
Itamar,

@ Itmar, è sicuramente quello che proverei per primo. Tuttavia, sembra che ci debba essere un modo per garantire che gli esempi che conservi siano rappresentativi del set di dati più grande.
Matt Krause,

1
Un'opzione potrebbe essere quella di eseguire PCA (analisi dei componenti principali) sul set più grande, raggruppare i punti in base al primo componente principale e selezionare un campione da ciascun cluster.
Itamar,
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.