Come modificare la soglia per la classificazione in R randomForests?


10

Tutta la letteratura sul modello di distribuzione delle specie suggerisce che quando si prevede la presenza / assenza di una specie usando un modello che genera probabilità (ad esempio, RandomForests), la scelta della soglia di probabilità in base alla quale classificare effettivamente una specie come presenza o assenza è importante e si dovrebbe non sempre fare affidamento sul valore predefinito 0,5. Ho bisogno di aiuto con questo! Ecco il mio codice:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

Da ciò ho determinato che la soglia che vorrei utilizzare per classificare la presenza dalle probabilità previste è 0,7, non il valore predefinito 0,5. Non capisco perfettamente cosa fare con queste informazioni. Uso semplicemente questa soglia quando creo una mappa del mio output? Potrei facilmente creare un output mappato con probabilità continue, quindi riclassificare semplicemente quelli con valori maggiori di 0,7 come presenti e quelli <0,7 come assenti.

Oppure, voglio prendere queste informazioni e rieseguire la mia modellazione randomForests, usando il parametro cut-off? Cosa sta facendo esattamente il parametro cut-off? Cambia il voto risultante? (attualmente dice che è "maggioranza"). Come posso usare questo parametro di cut-off? Non capisco la documentazione! Grazie!


2
Direi che questo potrebbe appartenere qui: il problema di (1) stime di probabilità da RF, (2) se è possibile imporre una funzione di costo sul modello o doverla incorporare nel modello e (3) come implementare le funzioni di costo nella RF sono ricorrenti problemi che non sono semplicemente legati alla programmazione.
charles,

Risposte:


7

# imposta la soglia o il valore di cutoff su 0,7

cutoff=0.7

#tutti i valori inferiori al valore di cutoff 0,7 saranno classificati come 0 (presente in questo caso)

RFpred[RFpred<cutoff]=0

#tutti i valori maggiori del valore di cutoff 0,7 saranno classificati come 1 (assente in questo caso)

 RFpred[RFpred>=cutoff]=1

1
Potresti ampliare un po 'la tua risposta? Perlomeno sarebbe utile annotare il codice.
Patrick Coulombe,

2
FWIW, penso che questo sia perfettamente sufficiente.
Sycorax dice di reintegrare Monica il

Questa risposta è perfettamente sana. Sono d'accordo.
Seanosapien,

7

Mi dispiace non aver ottenuto e tentativi di risposte. Consiglierei il libro di Max Kuhn per la copertura di questo problema. Questo è un problema abbastanza ampio. Basta aggiungere alcuni bit:

  1. Le curve ROC sono popolari, ma hanno senso solo se stai cercando di capire il compromesso tra i risultati Falso negativo e Falso positivo. Se CostFN = CostFP non è sicuro che abbiano senso. La statistica c e altre misure derivate sono ancora utili. Se si desidera massimizzare la precisione, basta sintonizzare il proprio modello per questo (il pacchetto con cursore rende tutto più semplice), non andare a creare una curva ROC.
  2. Tutti usano le probabilità derivate dai modelli RF. Penso che si debba pensare a ciò - questi non sono modelli probabilistici, non sono costruiti per farlo. Funziona spesso Come minimo avrei prodotto un diagramma di convalida delle probabilità RF su nuovi dati se fossi davvero interessato alle probabilità
  3. Il modo più semplice sarebbe usare "semplicemente riclassificare quelli con valori maggiori di 0,7 come presenti e quelli <0,7 come assenti".
  4. Se il costo (FN) non equivale al costo (FP), è necessario rendere la RF sensibile ai costi. R non lo rende facile. La funzione di ponderazione nel pacchetto RandomForest non funziona. L'opzione migliore è quella di giocare con il campionamento, sottocampionare il caso maggioritario per ottenere la funzione di costo desiderata. Ma la relazione tra rapporto campione e costo non è diretta. Quindi potresti voler rimanere con (3)

Aggiornamento per quanto riguarda i pesi di classe Andy Liaw:
"L'attuale opzione" classwt "nel pacchetto randomForest è stata presente sin dall'inizio, ed è diversa da come il codice ufficiale Fortran (versione 4 e successive) implementa i pesi di classe. pesi nel calcolo dell'indice Gini quando si dividono i nodi, esattamente come viene fatto un singolo albero CART quando vengono dati i pesi delle classi. Il Prof. Breiman ha ideato il nuovo schema di ponderazione delle classi implementato nella nuova versione del suo codice Fortran dopo aver scoperto che semplicemente usando i pesi nell'indice Gini non sembravano essere di grande aiuto in dati estremamente sbilanciati (diciamo 1: 100 o peggio). Se usare Gini ponderato aiuta nella tua situazione, lo faccio sicuramente. Posso solo dire che in passato non ci ha dato il risultato che ci aspettavamo ".


Potresti approfondire il punto (4) perché l'argomento ponderazione non funziona?
Sycorax dice di reintegrare Monica il

2
La mia comprensione è stata che è implementato in modo appropriato nel codice Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) ma non nel pacchetto R. Di questo si discute: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) e si concentra sulla necessità di utilizzare i pesi in tutte le fasi della costruzione dell'albero - non solo la divisione di Gini. Quindi l'attuale implementazione R - che utilizza solo la ponderazione alla divisione non funziona molto bene
charles
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.