2012-02-13 12 views
8

Estoy experimentando con R y con el paquete randomForest, tengo algo de experiencia con SVM y Neural Nets. Mi primera prueba es intentar y retroceder: sin (x) + ruido gaussiano. Con Neural Nets y svm obtengo una aproximación "relativamente" agradable de sin (x) para que el ruido se filtre y el algoritmo de aprendizaje no se sobreajuste. (para parámetros decentes) Al hacer lo mismo en randomForest tengo una solución completamente sobreajustada. simplemente uso (R 2.14.0, 2.14.1 trataron en demasiado, por si acaso):RandomForest for Regression en 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) 

supongo que hay una opción de magia en randomForest para que funcione correctamente, probé unos pero no encontró la palanca derecha para tirar ...

Respuesta

3

Puede usar para limitar el tamaño de los árboles, como en los ejemplos en el manual.

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

Esa fue una de las opciones que probé, da un resultado ligeramente mejor pero aún parece muy malo en comparación con svm y nn ... debe haber un mejor conjunto de opciones ... – user1206729

+2

Una de las cosas interesantes sobre el aprendizaje automático es que no hay un método único para todos. Ciertos tipos de algos son mejores para diferentes tipos de datos. Lamentablemente, no he encontrado una fuente que describa qué método es mejor para qué conjunto de datos y, por lo tanto, confío casi exclusivamente en prueba y error. – screechOwl

1

Puede hacer mucho mejor (rmse ~ 0,04, $ R^2 $> 0,99) mediante la formación de los árboles individuales en muestras pequeñas o bites como Breiman los llamó

Dado que existe una cantidad significativa de ruido en los datos de entrenamiento, este problema se trata realmente de suavizar en lugar de generalización. En términos generales de aprendizaje automático, esto requiere una mayor regularización. Para el aprendiz de conjunto esto significa intercambiar fuerza por la diversidad.

La diversidad de randomForests puede aumentar al reducir el número de características candidatas por división (mtry en R) o el conjunto de entrenamiento de cada árbol (sampsize en R). Como solo hay 1 entrada dimesion, mtry no ayuda, dejando sampsize. Esto lleva a una mejora de 3.5x en RMSE sobre la configuración predeterminada y> 6x de mejora sobre los datos de entrenamiento ruidosos. Dado que una mayor división significa una mayor varianza en la predicción de los alumnos individuales, también necesitamos aumentar la cantidad de árboles para estabilizar la predicción por conjuntos.

pequeñas bolsas, más árboles :: RMSE = 0,04:

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

configuración predeterminada :: RMSE = 0,14:

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

error debido al ruido en el conjunto de entrenamiento :: rmse = 0 .25

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

El error debido al ruido es por supuesto evidente de

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

En lo anterior la evaluación se está haciendo contra el conjunto de entrenamiento, ya que es en la pregunta original.Dado que el problema es suavizado en lugar de generalización, esto no es tan atroz que pueda parecer, pero es alentador ver que de la evaluación bolsa muestra una precisión similar:

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

Mi intuición es que:

  • si tuvieras un árbol de decisión simple para ajustarse a una curva 1 dimensional f (x), que sería equivalente a una función de escalera (no necesariamente con saltos espaciados equitativamente)
  • con bosques aleatorios harás una combinación lineal de funciones de escalera

Para que una función de escalera sea un buen aproximador de f (x), quiere suficientes pasos en el eje x, pero cada paso debe contener suficientes puntos para que su media sea una buena aproximación de f (x) y menos afectado por el ruido.

Así que le sugiero que sintonice el parámetro nodesize. Si tiene 1 árbol de decisión y N puntos, y nodesize = n, entonces su función de escalera tendrá N/n pasos. n demasiado pequeño trae sobreajuste. Tengo buenos resultados con n ~ 30 (RMSE ~ 0,07):

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

en cuenta que RMSE se hace más pequeño si se toma N '= 10 * N y N' = 10 * n.

Cuestiones relacionadas