Ponderazione dei dati più recenti nel modello Foresta casuale


14

Sto addestrando un modello di classificazione con Random Forest per discriminare tra 6 categorie. I miei dati transazionali hanno circa 60k + osservazioni e 35 variabili. Ecco un esempio di come appare approssimativamente.

 _________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay  |
|-------|----------------|-------|-------|--------|
|111    | 2013-04-01     | 12    | US    | group1 |
|222    | 2013-04-12     | 6     | PNG   | group1 |
|333    | 2013-05-05     | 30    | DE    | group2 |
|444    | 2013-05-10     | 78    | US    | group3 |
|555    | 2013-06-15     | 15    | BR    | group1 |
|666    | 2013-06-15     | 237   | FR    | group6 |

Una volta creato il modello, vorrei ottenere un punteggio delle osservazioni dell'ultima settimana. Poiché sono state apportate modifiche al sistema, le osservazioni più recenti assomigliano più da vicino all'ambiente delle osservazioni attuali che mi piacerebbe prevedere. Quindi, voglio creare una variabile di peso in modo tale che la foresta casuale attribuisca maggiore importanza alle recenti osservazioni.

Qualcuno sa se il pacchetto randomForest in R è in grado di gestire pesi per osservazione?

Inoltre, puoi suggerire qual è un buon metodo per creare la variabile di peso? Ad esempio, poiché i miei dati sono del 2013, stavo pensando di poter prendere il numero del mese dalla data come peso. Qualcuno vede un problema con questo metodo?

Molte grazie in anticipo!


Potresti considerare di pubblicare una domanda su overflow dello stack. Ti aiuteranno di più con i problemi di implementazione. Il focus di questo sito è più basato sulla teoria.
Alex Williams,

Probabilmente non sono abbastanza chiaro nei miei scritti, ma le mie domande non riguardano il problema dell'implementazione. Ad esempio, nella parte in cui chiedo di creare la variabile weight, non intendo chiedere quale comando in R possa aiutarmi a farlo. Mi chiedevo semplicemente se in tal modo avrei violato qualcuno dei presupposti della foresta casuale.
Nikolay Nenov,

1
La risposta è no, credo. Puoi assegnare pesi a diversi gruppi come ho spiegato nella mia risposta di seguito. Capisco che questo non è ciò che ti interessa, ma è un'idea simile. Potresti provare a usare osservazioni duplicate come suggerisco.
Alex Williams,

Risposte:


5

Il rangerpacchetto in R ( pdf ), che è relativamente nuovo, lo farà. L'implementazione di ranger di foreste casuali ha un case.weightsargomento che prende un vettore con singoli casi / pesi di osservazione.


! Neat Le cuciture piacciono la soluzione che stavo cercando. Hai un link ai dettagli di come viene calcolata la probabilità case.weights?
Nikolay Nenov,

1
Non sono sicuro al 100% di come calcolano le probabilità, ma penso che, se vuoi iniziare, dai un'occhiata a questo documento: Malley, JD, Kruppa, J., Dasgupta, A., Malley, KG e Ziegler , A. (2012). Macchine di probabilità: stima coerente della probabilità mediante macchine di apprendimento non parametriche. Metodi Inf Med 51: 74-81. dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries

7

È possibile ricampionare i dati per rappresentare i punti dati più recenti. Rf comporta comunque un passaggio di campionamento con sostituzione e "insaccamento approssimativamente bilanciato" per le classi non bilanciate utilizza il campionamento per rappresentare eccessivamente la classe di minoranza e produce risultati come foresta casuale ponderata migliore o migliore della classe nella mia esperienza.

Potresti ricampionare a livello di costruzione della tua matrice di allenamento ( riferimento ) invece che durante l'insaccamento per semplificare l'implementazione, anche se suggerirei di fare molte ripetizioni in quel caso.

Internamente alcune implementazioni di foreste casuali, incluso lo scikit-learn, utilizzano effettivamente i pesi dei campioni per tenere traccia di quante volte ogni campione è in borsa e dovrebbe essere equivalente al sovracampionamento a livello di insaccamento e vicino al sovracampionamento a livello di addestramento nella convalida incrociata.


4

Dovresti esaminare il parametro "classwt". Questo non sembra essere ciò a cui sei direttamente interessato, ma potrebbe darti un'idea di ciò che vuoi fare.

Vedi qui: Stack Exchange domanda n. 1

E qui: Stack Exchange domanda n. 2

Articolo sulle foreste casuali ponderate: PDF

L'idea di base è ponderare le classi in modo tale che i gruppi / le classificazioni osservate raramente abbiano maggiori probabilità di essere selezionate nei campioni bootstrap. Ciò è utile per i dati sbilanciati (quando le probabilità precedenti di classi diverse sono ampiamente diverse).

Mi sembra che tu voglia fare qualcosa di simile, ma per eventi recenti (non per determinati gruppi / classificazioni). Un modo semplice per farlo sarebbe quello di creare osservazioni duplicate (ovvero inserire righe ripetute e identiche) per osservazioni più recenti. Tuttavia, questo potrebbe essere potenzialmente inefficiente. Non conosco un modo per ponderare direttamente ogni osservazione in R, ma potrei esserne ignaro.

Potresti provare a cercare implementazioni alternative, ad esempio in C - nel peggiore dei casi, queste potrebbero essere personalizzate con un po 'di codice.


1
Grazie mille per i collegamenti, Alex. L'articolo fornisce buoni esempi di casi in cui si desidera ponderare i propri classificatori. Temo che questo non funzioni per me, tuttavia, poiché non è possibile utilizzare il parametro "classwt" per qualsiasi cosa diversa dalla ponderazione dei classificatori, ovvero è necessario un peso per classe, altrimenti randomForest restituirà un errore.
Nikolay Nenov,

1
Sì, non penso che tu possa usare direttamente "classwt". Volete alcuni parametri come "pesi di osservazione" ma non credo che esista.
Alex Williams,
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.