Random Forest nel 2023 Estensioni moderne di un metodo potente

Random Forest nel 2023 Estensioni aggiornate di un metodo potente

I Random Forest hanno fatto molta strada

Caratteristiche dei moderni metodi di Random Forest. Fonte: Autore.

In termini di timeline di Machine Learning, i Random Forest (RF), introdotti nell’articolo fondamentale di Breimann ([1]), sono antichi. Nonostante la loro età, continuano a stupire con le loro prestazioni e sono un argomento di ricerca attiva. Lo scopo di questo articolo è evidenziare quanto una versatilità sia diventato lo strumento di lavoro dei metodi Random Forest, concentrando l’attenzione su Generalized Random Forest (GRF) e Distributional Random Forest (DRF).

In breve, l’idea principale su cui si basano entrambi i metodi è che i pesi prodotti implicitamente da RF possono essere utilizzati per stimare obiettivi diversi dalla media condizionale. L’idea di GRF è quella di utilizzare un Random Forest con un criterio di suddivisione adattato all’obiettivo che si ha in mente (ad esempio, media condizionale, quantili condizionali o l’effetto del trattamento condizionale). L’idea di DRF è quella di adattare il criterio di suddivisione in modo tale che sia possibile stimare l’intera distribuzione condizionale. Da questo oggetto, molti obiettivi diversi possono quindi essere derivati ​​in un secondo step. In realtà, in questo articolo parlo principalmente di DRF, poiché sono più familiare con questo metodo ed è un po ‘più snello (è necessario adattare solo un albero per una vasta gamma di obiettivi). Tuttavia, tutti i vantaggi, indicati nella figura sopra, si applicano anche a GRF e infatti, il pacchetto DRF in R si basa sull’implementazione professionale di GRF (fonte). Inoltre, il fatto che il criterio di suddivisione degli alberi GRF sia adattato all’obiettivo significa che può avere prestazioni migliori rispetto a DRF. Questo è particolarmente vero per Y binario, dove dovrebbe essere utilizzato probability_forests(). Pertanto, anche se parlo principalmente di DRF, GRF dovrebbe essere tenuto presente durante la lettura di questo articolo.

Lo scopo di questo articolo è fornire una panoramica con collegamenti per approfondimenti nelle sezioni corrispondenti. Scorreremo ciascuno dei punti nella figura sopra in senso orario, facendo riferimento agli articoli corrispondenti e evidenziandoli con un piccolo esempio. Per prima cosa, riassumo velocemente i collegamenti più importanti per ulteriori approfondimenti:

Versatilità/Performance: Articolo VoAGI e articoli originali (DRF/GRF)

Valori mancanti incorporati: Articolo VoAGI

Misure di incertezza: Articolo VoAGI

Importanza delle variabili: Articolo VoAGI

L’esempio

Prendiamo X_1, X_2, X_4, …, X_10 indipendentemente uniformi tra (-1,1) e creiamo una dipendenza tra X_1 e X_3 prendendo X_3=X_1 + errore uniforme. Poi simuliamo Y come

## Carica i pacchetti e le funzioni necessarie library(drf)library(mice)source("drfnew_v2.R")## La funzione drfnew_v2.R è disponibile di seguito, o su ## https://github.com/JeffNaef/drfupdate## Imposta i parametriset.seed(10)n<-1000##Simula dati che subiscono spostamenti sia della media che della sd# Simula da Xx1 <- runif(n,-1,1)x2 <- runif(n,-1,1)x3 <- x1+ runif(n,-1,1)X0 <- matrix(runif(7*n,-1,1), nrow=n, ncol=7)Xfull <- cbind(x1,x2, x3, X0)colnames(Xfull)<-paste0("X", 1:10)# Simula la variabile dipendente YY <- as.matrix(rnorm(n,mean = 0.8*(x1 > 0), sd = 1 + 1*(x2 > 0)))##Aggiungi anche valori mancanti MAR usando ampute dal pacchetto miceX<-ampute(Xfull)$amphead(cbind(Y,X))           Y         X1          X2          X3          X4           X51 -3.0327466 -0.4689827  0.06161759  0.27462737          NA -0.6244630792  1.2582824 -0.2557522  0.36972181          NA -0.04100963  0.0095180473 -0.8781940  0.1457067 -0.23343321          NA -0.64519687 -0.9454263054  3.1595623  0.8164156  0.90997600  0.69184618 -0.20573331 -0.0074042985  1.1176545 -0.5966361          NA -1.21276055  0.62845399  0.8947034226 -0.4377359  0.7967794 -0.92179989 -0.03863182  0.88271415 -0.237635732          X6         X7          X8         X9        X101 -0.9290009  0.5401628  0.39735433 -0.7434697  0.88075582 -0.2885927  0.3805251 -0.09051334 -0.7446170  0.99353113 -0.5022541  0.3009541  0.29424395  0.5554647 -0.53418004  0.7583608 -0.8506881  0.22758566 -0.1596993 -0.71619765 -0.3640422  0.8051613 -0.46714833  0.4318039 -0.86740606 -0.3577590 -0.7341207  0.85504668 -0.6933918  0.4656891

Notate che con la funzione ampute del pacchetto mice, inseriamo valori mancanti di tipo Missing not at Random (MAR) su X per evidenziare l’abilità di GRF/DRF nel gestire i valori mancanti. Inoltre, nel processo sopra descritto solo X_1 e X_2 sono rilevanti per la predizione di Y, tutte le altre variabili sono “rumore”. Un tale contesto “sparso” potrebbe essere effettivamente comune nei dataset reali.

Ora scegliamo un punto di prova per questo esempio che useremo in tutto:

x<-matrix(c(0.2, 0.4, runif(8,-1,1)), nrow=1, ncol=10)print(x)     [,1] [,2]      [,3]      [,4]      [,5]      [,6]    [,7]      [,8][1,]  0.2  0.4 0.7061058 0.8364877 0.2284314 0.7971179 0.78581 0.5310279           [,9]     [,10][1,] -0.5067102 0.6918785

Versatilità

DRF stima la distribuzione condizionale P_{Y|X=x} nella forma di pesi semplici:

Da questi pesi, può essere calcolata una vasta gamma di obiettivi, oppure possono essere utilizzati per simulare dalla distribuzione condizionale. Un buon riferimento per la sua versatilità è l’articolo di ricerca originale qui, dove sono stati utilizzati molti esempi, così come l’articolo corrispondente qui.

Nell’esempio, prima simuleremo da questa distribuzione:

DRF<-drfCI(X=X, Y=Y, B=50,num.trees=1000, min.node.size = 5)DRFpred<-predictdrf(DRF, newdata=x)## Sample from P_{Y| X=x}Yxs<-Y[sample(1:n, size=n, replace = T, DRFpred$weights[1,])]hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred"  )
Istogramma della distribuzione condizionale stimata sovrapposto alla vera densità (in rosso). Fonte: Autore.

Il grafico mostra le approssimazioni tratte dalla distribuzione condizionale sovrapposte alla vera densità in rosso. Ora utilizzeremo questo per stimare l’aspettazione condizionale e i quantili condizionali (0.05, 0.95) in x:

# Calcolare la previsione dei quantili come quantili ponderati da Yqx <- quantile(Yxs, probs = c(0.05,0.95))# Calcolare la previsione della media condizionalemux <- mean(Yxs)# Veri quantiliq1<-qnorm(0.05, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))q2<-qnorm(0.95, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))mu<-0.8 * (x[1] > 0)hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred"  )abline(v=q1,col="darkred" )abline(v=q2, col="darkred" )abline(v=qx[1], col="darkblue")abline(v=qx[2], col="darkblue")abline(v=mu, col="darkred")abline(v=mux, col="darkblue")
Istogramma della distribuzione condizionale simulata sovrapposta alla vera densità (in rosso). Inoltre, l'aspettativa condizionale stimata e i quantili condizionali (0.05, 0.95) sono in blu, con i valori veri in rosso. Fonte: Autore.

Allo stesso modo, molti obiettivi possono essere calcolati con GRF, solo che in questo caso per ciascuno di quei due obiettivi sarebbe necessario adattare un foresta diversa. In particolare, regression_forest() per l’aspettativa condizionale e quantile_forest() per i quantili.

Ciò che GRF non può fare è gestire obiettivi multivariati, che è possibile invece con DRF.

Performance

Nonostante tutto il lavoro sui potenti nuovi metodi (non parametrici), come le reti neurali, i metodi basati su alberi sono costantemente in grado di battere i concorrenti sui dati tabulari. Vedere ad esempio, questo affascinante articolo, o questo vecchio articolo sulla potenza di RF nella classificazione.

Ad essere onesti, con l’ottimizzazione dei parametri, i metodi di alberi potenziati, come XGboost, spesso prendono il comando, almeno per quanto riguarda la previsione classica (che corrisponde all’aspettativa condizionale). Tuttavia, la robusta performance dei metodi RF tende ad essere notevole anche senza alcuna ottimizzazione. Inoltre, ci sono state anche ricerche volte al miglioramento delle prestazioni di Random Forests, ad esempio, l’approccio Random Forests coperti.

Valori Mancanti Incorporati

Il criterio “Missing incorporated in attributes criterion” (MIA) di questo articolo è un’idea molto semplice ma molto potente che consente ai metodi basati su alberi di gestire i dati mancanti. Questo è stato implementato nel pacchetto R GRF ed è quindi disponibile anche in DRF. I dettagli sono spiegati anche in questo articolo di VoAGI. Per quanto semplice sia il concetto, funziona notevolmente bene in pratica: nell’esempio sopra, DRF non ha avuto problemi a gestire una notevole mancanza di dati MAR nel train data X (!)

Misure di Incertezza

Come statistico, non voglio solo stime puntuali (anche di una distribuzione), ma anche una misura dell’incertezza di stima dei miei parametri (anche se il “parametro” è l’intera distribuzione). Risulta che un semplice campionamento aggiuntivo integrato in DRF/GRF consente una quantificazione dell’incertezza fondamentale per campioni di grandi dimensioni. La teoria dietro questo caso di DRF è derivata in questo articolo di ricerca, ma lo spiego anche in questo articolo di VoAGI. GRF ha tutta la teoria nel paper originale.

Adattiamo questo per l’esempio sopra:

# Calcola l'incertezzaalpha<-0.05B<-length(DRFpred$weightsb)qxb<-matrix(NaN, nrow=B, ncol=2)muxb<-matrix(NaN, nrow=B, ncol=1)for (b in 1:B){Yxsb<-Y[sample(1:n, size=n, replace = T, DRFpred$weightsb[[b]][1,])]qxb[b,] <- quantile(Yxsb, probs = c(0.05,0.95))muxb[b] <- mean(Yxsb)}CI.lower.q1 <- qx[1] - qnorm(1-alpha/2)*sqrt(var(qxb[,1]))CI.upper.q1 <- qx[1] + qnorm(1-alpha/2)*sqrt(var(qxb[,1]))CI.lower.q2 <- qx[2] - qnorm(1-alpha/2)*sqrt(var(qxb[,2]))CI.upper.q2 <- qx[2] + qnorm(1-alpha/2)*sqrt(var(qxb[,2]))CI.lower.mu <- mux - qnorm(1-alpha/2)*sqrt(var(muxb))CI.upper.mu <- mux + qnorm(1-alpha/2)*sqrt(var(muxb))hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred"  )abline(v=q1,col="darkred" )abline(v=q2, col="darkred" )abline(v=qx[1], col="darkblue")abline(v=qx[2], col="darkblue")abline(v=mu, col="darkred")abline(v=mux, col="darkblue")abline(v=CI.lower.q1, col="darkblue", lty=2)abline(v=CI.upper.q1, col="darkblue", lty=2)abline(v=CI.lower.q2, col="darkblue", lty=2)abline(v=CI.upper.q2, col="darkblue", lty=2)abline(v=CI.lower.mu, col="darkblue", lty=2)abline(v=CI.upper.mu, col="darkblue", lty=2)
Istogramma della distribuzione condizionale simulata sovrapposta alla densità reale (in rosso). Inoltre, l'aspettativa condizionale stimata e i quantili condizionali (0.05, 0.95) sono in blu, con i valori reali in rosso. Inoltre, le linee tratteggiate rosse sono gli intervalli di confidenza per le stime calcolate da DRF. Fonte: Autore.

Come si può vedere dal codice sopra, abbiamo essenzialmente B sotto-alberi che possono essere utilizzati per calcolare la misura ogni volta. Da questi B campioni di media e quantili, possiamo quindi calcolare le varianze e utilizzare un’approssimazione normale per ottenere gli intervalli di confidenza (asintotici) visualizzati sulla linea tratteggiata nella Figura. Ancora una volta, tutto questo può essere fatto nonostante i valori mancanti in X(!)

Importanza Variabile

Un aspetto finale importante di Random Forests è il calcolo efficiente delle misure di importanza variabile. Mentre le misure tradizionali sono in parte ad hoc, per Random Forest tradizionali e per DRF sono ora disponibili misure basate su principi d base, come spiegato in questo articolo VoAGI. Per RF, il metodo Sobol-MDA identifica in modo affidabile le variabili più importanti per la stima dell’aspettativa condizionale, mentre per DRF, l’MMD-M