7 votos

Efecto de los términos categóricos de la interacción con algoritmo de aprendizaje de máquina forestal al azar

Gracias de antemano por la ayuda.

He moderadamente amplio conjunto de datos (alrededor de 7000 muestras) con numerosos los predictores categóricos y una sola respuesta binaria. Todos los predictores son categóricos. A través de ensayo y error he encontrado que el uso de un bosque aleatorio modelo produce la mejor exactitud de predicción de la respuesta.

Con el fin de aumentar la exactitud de mi modelo decidí incluir pares de términos de interacción. Sin embargo, ello condujo a una disminución en la precisión. Inicialmente se supone que esto sea porque la inclusión de los términos de interacción agrega un número significativo de predictores a mi conjunto de entrenamiento. En concreto, antes de la adición de los términos de interacción tengo 12 predictores y después de la adición de alrededor de 60. Con un maniquí de codificación tengo aproximadamente 60 predictores y un par de cientos, de manera respetuosa.

Con esto en mente, me realiza la selección de características y recogió los 5,10,15,etc mejores predictores para entrenar a mi modelo. Esto tuvo poco efecto sobre la exactitud de mi modelo, a saber, que no era tan bueno como el modelo sin términos de interacción. Aviso que yo optimizado para los árboles en el bosque y el número de características que se usan en la selección al azar.

En este punto, uno podría concluir que los términos de interacción no añadir nada a mi modelo. Sin embargo, tengo una buena evidencia de que deben ser muy fuertes predictores de la respuesta. Lo ideal sería poder tener interacciones más complicado que sólo los pares, pero no tengo suficientes muestras de ello.

Me pregunto ahora si este comportamiento es resultado del método que estoy utilizando, es decir, yo estoy usando un bosque de árboles. Supongamos por el momento que estoy usando sólo un árbol. Es posible que el uso de datos categóricos para entrenar a un tipo de árbol modelo intrínsecamente codifica interacciones? Si es así, esto podría explicar por qué, incluyendo los términos de interacción conduce a una disminución en la capacidad de predicción de rendimiento de mi modelo.

Realizar función de los resultados de la selección en la selección, casi exclusivamente, de la interacción de los predictores. Cuando produzco un bosque aleatorio usando estos predictores entonces estoy limitando mi "camino". Voy a motivar a esto con un ejemplo. Supongamos que tengo predictores $w$,$x$,$y$,$z$ y mediante la selección de características me instalo en la interacción predictores $wx$$yz$. Yo ya no puede producir un árbol que las ramas en el $x$ y, a continuación, en $y$. Puedo, sin embargo, producir un árbol con el original de predictores sin interacciones.

Aquí está mi hipótesis. La producción de un bosque aleatorio con solo el original predictores me permite "codificar" interacciones a través del comportamiento de ramificación de los árboles. Utilizando sólo los resultados de la selección de la función de rendimiento no es tan bueno ya que las características seleccionadas son predominantemente de interacciones. Esto limita el comportamiento de ramificación de los árboles generados. Por último, incluyendo todo lo que no se desempeñan tan bien ya que esto se traduce en muy muchos predictores. No tengo suficientes muestras para el modelo para entrenar correctamente. También debo señalar que me miraba con el original predictores y un puñado de los mejores interacciones, según lo determinado por la selección de características. Esto también no se desempeñan tan bien como el uso de sólo el original de predictores.

Aquí está mi pregunta. Estoy mirando esto de la manera correcta? Más específicamente, ¿ la generación de un árbol usando solo los predictores categóricos inherentemente codificar las interacciones entre los predictores? También cualquier idea o consejo sobre cómo como alternativa frente a este problema (la predicción de la respuesta binaria) sería muy apreciada.

Gracias.

5voto

Mirko Friedenhagen Puntos 304

Creo que tus preguntas son muy interesantes, dedico algo de mi tiempo mirando a la eficaz asignación de curvatura de bosque aleatorio(RF) el modelo se ajusta. RF puede capturar algunas órdenes de interacciones en función de la situación. x1 * x2 es una interacción bidireccional y así sucesivamente... no escribir cómo muchos niveles de su los predictores categóricos había. Importa mucho. Para un trabajo continuo de las variables(varios niveles) a menudo no más de varios locales de las interacciones de dos puede ser capturado. El problema es, que el modelo RF en sí mismo sólo se divide, y no la transformación de los datos. Por lo tanto, RF está pegado con local uni-variable divisiones que no es óptimo para cautivadora interacciones. Por lo tanto, RF es bastante superficial en comparación con profundo-lerning. En el otro extremo del espectro están binario características. Yo no sé cómo lo profundo de RF puede ir, así que me fui corriendo de un sistema de búsqueda de simulación. RF parece captar a algunos de 4 a 8 órdenes de interacciones binarias características. Yo uso 12 variables binarias y de 100 a 15.000 observaciones. E. g. para las 4 de la orden de la interacción, la predicción del vector y es:

orderOfInteraction = 4
y = factor(apply(X[,1:orderOfInteraction],1,prod))

donde cualquier elemento de X es -1 o 1 y el producto de las cuatro primeras columnas de variables de X es la predicción. Las cuatro variables son completamente gratuitos. Por lo tanto, no hay efectos principales, 2º o 3º de la orden de los efectos. El OOB error de predicción será, por tanto, sólo reflejan lo bien RF puede cautivar a una interacción de la N-ésimo orden.

Las cosas que hace que el RF captivate de orden superior de las interacciones: un montón de observación, algunos de los niveles en las variables, algunas de las variables

Factores limitantes para la RF cautivadora órdenes superiores: al contrario de la anterior, limitada sampsize, limitada maxnodes redundante y/suficiente de menor orden de la información.

El último significa que si la RF puede encontrar la misma información en los bajos de interacciones de orden, no es, por así decirlo, no hay necesidad de ir más profundo. La información puede incluso no ser redundante. Simplemente tiene que ser suficiente para RF para hacer binario correcto predicciones.

La profundidad del bosque aleatorio: OOB err.tasa de frente observaciones vs orden de la interacción Depth of random forest: OOB err.rate vs. observations vs. order of interaction

  rm(list=ls())
  library(randomForest)
  library(parallel)
  library(rgl)

  simulate.a.forest = function(std.pars,ite.pars) {
    #Merge standard parameters with iterated parameters
    run.pars = c(std.pars,ite.pars)

    #simulate data of a given order
    X = replicate(run.pars$vars,sample(c(-1,1),run.pars$obs,replace=T))
    y = factor(apply(X[,1:run.pars$intOrder],1,prod))

    #run forest with run.pars, pars with wrong name is ignored
    rfo = do.call(randomForest, run.pars)

    #Fetch OOB error.rate and return
    out = rev(rfo$err.rate[,1])[1] #fetch error rate from object
    names(out) = paste(ite.pars,collapse="-")[1]
    return(out)
  }

  ## Lets try some situations (you can also pass arguments to randomForest here)
  intOrders = c(2,3,4,5,6,12) #hidden signal is a N-way interaction of Nth order
  obss = c(100,500,1000,3500,7000,15000) #available observations

  ## Produce list of all possible combinations of parameters
  ite.pars.matrix = expand.grid(intOrder=intOrders,obs=obss)
  n.runs = dim(ite.pars.matrix)[1]
  ite.pars.list   = lapply(1:n.runs, function(i) ite.pars.matrix[i,])

  i=1 ##for test-purposes
  out = mclapply(1:n.runs, function(i){
    #line below can be run alone without mclapply to check for errors before going multicore
    out = simulate.a.forest(std.pars=alist(x=X,y=y,
                                           ntree=250,
                                           vars=12),
                                           #sampsize=min(run.pars$obs,2000)),
                            ite.pars=ite.pars.list[[i]])
    return(out)
  })

  ##view grid results
  persp3d(x = intOrders,xlab="Nth order interaction",
          y = log(obss,base=10),ylab="10log(observations)",
          z = matrix(unlist(out),nrow=length(intOrders)),zlab="OOB prediction error, binary target",
          col=c("grey","black"),alpha=.2)

  rgl.snapshot(filename = "aweSomePlot.png", fmt = "png", top = TRUE)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by: