2012-02-13 19 views
8

Sto sperimentando con R e il pacchetto randomForest, ho un po 'di esperienza con SVM e reti neurali. Il mio primo test è provare e regredire: sin (x) + rumore gaussiano. Con Neural Nets e svm ottengo una "relativamente" buona approssimazione di sin (x) in modo che il rumore sia filtrato e l'algoritmo di apprendimento non si adatti eccessivamente. (per parametri decenti) Quando faccio lo stesso su randomForest, ho una soluzione completamente sovradimensionata. Io semplicemente uso (R 2.14.0, 2.14.1 provato su troppo, nel caso):RandomForest for Regression in R

library("randomForest") 
x<-seq(-3.14,3.14,by=0.00628) 
noise<-rnorm(1001) 
y<-sin(x)+noise/4 
mat<-matrix(c(x,y),ncol=2,dimnames=list(NULL,c("X","Y"))) 
plot(x,predict(randomForest(Y~.,data=mat),mat),col="green") 
points(x,y) 

Credo che ci sia un'opzione di magico nella foresta casuale per farlo funzionare correttamente, ho provato un paio, ma io non ha trovato la leva giusta per tirare ...

risposta

3

È possibile utilizzare per limitare la dimensione degli alberi, come negli esempi nel manuale.

r <- randomForest(Y~.,data=mat, maxnodes=10) 
plot(x,predict(r,mat),col="green") 
points(x,y) 
+0

Questa è stata una delle opzioni che ho provato, dà un risultato leggermente migliore ma sembra ancora molto male rispetto a svm e nn ... ci deve essere un migliore set di opzioni ... – user1206729

+2

Una delle cose interessanti di l'apprendimento automatico è che non esiste un metodo valido per tutti. Alcuni tipi di algos sono migliori per diversi tipi di dati. Sfortunatamente non ho trovato una fonte che descriva quale sia il metodo migliore per quale set di dati e quindi si basano quasi esclusivamente su tentativi ed errori. – screechOwl

1

Si può fare molto meglio (RMSE ~ 0,04, $ R^2 $> 0.99) per la formazione di singoli alberi su piccoli campioni o bites come Breiman chiamato li

Poiché non v'è una notevole quantità di rumore nei dati di addestramento, questo problema riguarda in realtà il livellamento piuttosto che la generalizzazione. In termini generali di apprendimento automatico ciò richiede una crescente regolarizzazione. Per il discente d'ensemble ciò significa negoziare la forza per la diversità.

La diversità di valori casuali può essere crescente riducendo il numero di funzioni candidate per divisione (mtry in R) o il set di allenamento di ciascun albero (sampsize in R). Poiché è disponibile solo 1 dimesione di ingresso, mtry non aiuta, lasciando sampsize. Ciò porta a un miglioramento 3,5x in RMSE rispetto alle impostazioni predefinite e un miglioramento di> 6 volte rispetto ai dati di allenamento rumorosi stessi. Poiché l'aumento della divresità significa maggiore variazione nella previsione dei singoli discenti, dobbiamo anche aumentare il numero di alberi per stabilizzare la previsione dell'insieme.

piccoli sacchetti, più alberi :: RMSE = 0.04:

>sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2, 
         replace=FALSE, ntree=5000), 
      mat) 
    - sin(x)) 
[1] 0.03912643 

impostazioni predefinite :: RMSE = 0.14:

> sd(predict(randomForest(Y~.,data=mat),mat) - sin(x)) 
[1] 0.1413018 

errore a causa del rumore in training set :: rmse = 0 .25

> sd(y - sin(x)) 
[1] 0.2548882 

L'errore a causa del rumore è naturalmente evidente da

noise<-rnorm(1001) 
y<-sin(x)+noise/4 

Nella suddetta valutazione è stato fatto contro l'insieme di addestramento, come è nella domanda originale.Dal momento che il problema è lisciando piuttosto che la generalizzazione, questo non è così eclatanti come può sembrare, ma è rassicurante vedere che, su valutazione sacchetto mostra una precisione simile:

> sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2, 
          replace=FALSE, ntree=5000)) 
    - sin(x)) 
[1] 0.04059679 
0

La mia intuizione è che:

  • se si disponesse di un albero decisionale semplice per adattare una curva 1 dimensionale f (x), sarebbe equivalente all'adattamento con una funzione scala (non necessariamente con salti equidistanti)
  • con foreste casuali si effettuerà una combinazione lineare di funzioni scale

Affinché una funzione di scala sia un buon approssimatore di f (x), si desidera avere abbastanza passaggi sull'asse x, ma ogni passaggio deve contenere abbastanza punti in modo che la loro media sia una buona approssimazione di f (x) e meno influenzato dal rumore.

Quindi suggerisco di sintonizzare il parametro nodesize. Se hai 1 albero decisionale e N punti, e nodesize = n, allora la tua funzione scala avrà N/n passi. n troppo piccolo porta al sovralimentazione. Ho bei risultati con n ~ 30 (RMSE ~ 0,07):

r <- randomForest(Y~.,data=mat, nodesize=30) 
plot(x,predict(r,mat),col="green") 
points(x,y) 

noti che RMSE diventa più piccola, se si prende N '= 10 * N e n' = 10 * n.

Problemi correlati