Come fare in modo che gli alberi della foresta casuale votino decimali ma non binari


9

La mia domanda riguarda la classificazione binaria, diciamo che separa i clienti buoni da quelli cattivi, ma non la regressione o la classificazione non binaria. In questo contesto, una foresta casuale è un insieme di alberi di classificazione. Per ogni osservazione, ogni albero vota un "sì" o "no" e il voto medio di tutti gli alberi è la probabilità finale della foresta.

La mia domanda riguarda la modifica del comportamento degli alberi sottostanti: Come possiamo modificare la funzione randomForest (del pacchetto randomForest di R) in modo che ogni albero voti un decimale anziché un sì / no binario. Per capire meglio cosa intendo per decimale, pensiamo a come funzionano gli alberi delle decisioni.

Un albero decisionale completamente sviluppato ha 1 istanza buona o 1 cattiva nei suoi nodi terminali. Supponiamo che io limiti la dimensione del nodo terminale a 100. Quindi i nodi terminali assomigliano:

Nodo1 = 80 cattivo, 20 buono
Nodo2 = 51 cattivo, 49 buono
Nodo3 = 10 cattivo, 90 buono

Nota, anche se Nodo1 e Nodo2 votano "cattivi", la loro "forza di cattiveria" è molto diversa. Questo è quello che sto cercando. Invece di farli produrre 1 o 0 (che è il comportamento predefinito) si può modificare il pacchetto R in modo che votino 80/100, 51/100, 10/100 ecc?


Volevo solo per includere il seguente Link per una discussione correlato: stackoverflow.com/questions/22409019/...
FatihAkici

Intendi che desideri le probabilità previste effettive , non solo la classe prevista più probabile.
smci,

Sì, esattamente @smci.
Fatih Akici,

Risposte:


10

Questo è un punto sottile che varia da software a software. Esistono due metodi principali di cui sono a conoscenza:

  1. Foglie binarie - Ogni foglia vota come maggioranza. Ecco come randomForestfunziona in R, anche quando si utilizzapredict(..., type="prob")
  2. Foglie proporzionali - Ogni foglia restituisce la proporzione dei campioni di allenamento appartenenti a ciascuna classe. sklearn.ensemble.RandomForestClassifier.predict_probaFunziona così . In un'altra risposta, @ usεr11852 sottolinea che il rangerpacchetto di R offre anche questa funzionalità. Fortunatamente, posso attestare che dal mio uso limitato, rangerè anche molto, molto più veloce di randomForest.

Non penso che ci sia un modo semplicerandomForest per usare il metodo foglia proporzionale, dal momento che il software R è in realtà solo un gancio in un programma C & FORTRAN. A meno che non ti piaccia modificare il codice di qualcun altro, dovrai scrivere il tuo o trovare un'altra implementazione software.


Grazie mille, Sycorax. Pensi che il codice sorgente di R randomForest possa essere modificato per accompagnarlo?
Fatih Akici,

Date sufficienti risorse, qualsiasi software può essere modificato per fare qualsiasi cosa. D'altra parte, randomForestè solo un'interfaccia R nel codice FORTRAN, quindi potrebbero essere necessarie notevoli risorse per realizzarlo.
Sycorax dice di reintegrare Monica il

@FatihAkici In realtà, sembra che mi sia sbagliato. Il codice compilato è una porta C del codice FORTRAN originale di Breiman.
Sycorax dice di reintegrare Monica il

5
Ho lavorato sul pacchetto randomForest per un'estate nel 2015 come parte di un REU. È sicuramente possibile modificare il codice per farlo, ma è un po 'complicato perché in realtà è C-Fortran misto. La maggior parte del codice "esterno" è C, mentre alcune funzioni principali rimangono in Fortran e sono collegate dopo la compilazione. Sfortunatamente, è passato troppo tempo da quando ho visto il codice per sapere dove cercare. ma suggerirei di essere pronto a lavorare in C e Fortran se vuoi modificare il pacchetto.
chipbuster

5

È perfettamente possibile far crescere una "foresta di probabilità". La metodologia in Malley et al. (2012) " Macchine di probabilità: stima della probabilità coerente usando macchine di apprendimento non parametriche " che delinea come viene fatto e come si confronta con l'implementazione casuale casuale della foresta. Inoltre, l' eccellente pacchetto Ranger R implementa già questa funzionalità; impostato probability = TRUEquando si effettua la chiamata di funzione a ranger.


2

Basta usare predict.randomForest(..., type="prob"). Stai facendo una buona cosa .


2
Stephan, grazie per la tua risposta, ma non è quello che sto cercando. Il codice che hai citato prende la media dei voti degli alberi binari sottostanti, ma sto provando a far decimare gli alberi sottostanti. Quindi in una foresta di 3 alberi, non voglio (1 + 1 + 0) / 3, piuttosto (.80 + .51 + .10) / 3. Ha senso?
Fatih Akici,

2
Ha senso, e questo è il comportamento del classificatore di foreste casuali in sklearn: scikit-learn.org/stable/modules/generated/…
psarka

1
Ah, capisco il tuo punto. Scusa, poi ho capito male. A giudicare dalla pagina di aiuto e guardando predict.alli norm.votesparametri e, questo non sembra essere possibile. Se lo vuoi davvero, probabilmente dovrai codificare la tua foresta casuale. Sono d'accordo con @psarka che questo ha perfettamente senso. (
Eliminerei

È stata davvero una discussione molto fruttuosa, cari Stephan e @psarka. Grazie!
Fatih Akici,
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.