Cómo lidiar con datos jerárquicos / anidados en el aprendizaje automático

29

Explicaré mi problema con un ejemplo. Suponga que desea predecir el ingreso de un individuo dados algunos atributos: {Edad, Sexo, País, Región, Ciudad}. Tienes un conjunto de datos de entrenamiento como este

train <- data.frame(CountryID=c(1,1,1,1, 2,2,2,2, 3,3,3,3), 
             RegionID=c(1,1,1,2, 3,3,4,4, 5,5,5,5), 
             CityID=c(1,1,2,3, 4,5,6,6, 7,7,7,8), 
             Age=c(23,48,62,63, 25,41,45,19, 37,41,31,50), 
             Gender=factor(c("M","F","M","F", "M","F","M","F", "F","F","F","M")),
             Income=c(31,42,71,65, 50,51,101,38, 47,50,55,23))
train
   CountryID RegionID CityID Age Gender Income
1          1        1      1  23      M     31
2          1        1      1  48      F     42
3          1        1      2  62      M     71
4          1        2      3  63      F     65
5          2        3      4  25      M     50
6          2        3      5  41      F     51
7          2        4      6  45      M    101
8          2        4      6  19      F     38
9          3        5      7  37      F     47
10         3        5      7  41      F     50
11         3        5      7  31      F     55
12         3        5      8  50      M     23

Ahora suponga que quiero predecir el ingreso de una nueva persona que vive en la Ciudad 7. Mi conjunto de entrenamiento tiene 3 muestras con personas en la Ciudad 7 (suponga que esto es mucho), por lo que probablemente pueda usar el ingreso promedio en la Ciudad 7 para predecir los ingresos de este nuevo individuo.

Ahora suponga que quiero predecir los ingresos de una nueva persona que vive en la Ciudad 2. Mi conjunto de entrenamiento solo tiene 1 muestra con la Ciudad 2, por lo que el ingreso promedio en la Ciudad 2 probablemente no sea un predictor confiable. Pero probablemente pueda usar el ingreso promedio en la Región 1.

Extrapolando un poco esta idea, puedo transformar mi conjunto de datos de entrenamiento como

    Age Gender CountrySamples CountryIncome RegionSamples RegionIncome CitySamples CityIncome
 1:  23      M              4         52.25             3        48.00           2    36.5000
 2:  48      F              4         52.25             3        48.00           2    36.5000
 3:  62      M              4         52.25             3        48.00           1    71.0000
 4:  63      F              4         52.25             1        65.00           1    65.0000
 5:  25      M              4         60.00             2        50.50           1    50.0000
 6:  41      F              4         60.00             2        50.50           1    51.0000
 7:  45      M              4         60.00             2        69.50           2    69.5000
 8:  19      F              4         60.00             2        69.50           2    69.5000
 9:  37      F              4         43.75             4        43.75           3    50.6667
10:  41      F              4         43.75             4        43.75           3    50.6667
11:  31      F              4         43.75             4        43.75           3    50.6667
12:  50      M              4         43.75             4        43.75           1    23.0000

Por lo tanto, el objetivo es combinar de alguna manera el promedio CityIncome, RegionIncome y CountryIncome mientras se usa el número de muestras de entrenamiento para cada una para dar un peso / credibilidad a cada valor. (Idealmente, aún incluye información de Edad y Género).

¿Cuáles son los consejos para resolver este tipo de problema? Prefiero usar modelos basados ​​en árboles como bosque aleatorio o aumento de gradiente, pero tengo problemas para que estos funcionen bien.

ACTUALIZAR

Para cualquiera que esté dispuesto a probar este problema, he generado datos de muestra para probar su solución propuesta aquí .

Ben
fuente
77
Los modelos bayesianos jerárquicos son muy naturales para explotar la estructura como se describe en sus datos. Vea el ejemplo clásico sobre el modelado de contaminación por radón mc-stan.org/documentation/case-studies/radon.html
Vladislavs Dovgalecs
Eche un vistazo a este desafío tutorial de introducción de Kaggle : kaggle.com/c/titanic . Se trata de un problema similar, es decir, predecir si una persona ha sobrevivido al desastre del Titanic dados diversos atributos sobre la persona, como género, tipo de boleto, etc. Las mejores soluciones presentadas para este uso utilizan métodos avanzados como el aumento de gradiente y modelos bayesianos jerárquicos. etc.
Vihari Piratla
66
@VihariPiratla Gracias por el aporte, pero estoy familiarizado con el conjunto de datos y el desafío del Titanic, y no veo cómo se relaciona con el problema de los datos anidados que pregunté.
Ben
El uso de la regularización L2 / L1 para esos modelos, por ejemplo, regresión logística / SVM que lo realiza, debería ayudar (bahías jerárquicas del hombre pobre). efectivamente penaliza los coeficientes, por lo que, a menos que un coeficiente mejore significativamente (es decir, en muchos datos), se establecerá en casi cero. y usas validación cruzada para decidir el nivel de penalización
seanv507
¿También quieres poder predecir los ingresos de una persona que vive en la ciudad 9?
jan-glx

Respuestas:

14

He estado pensando en este problema por un tiempo, con inspiraciones de las siguientes preguntas en este sitio.

jiyijxij

yij=f(xij)+ui+ϵij,
uij=1,,niuiϵijσu2σ2, la estimación empírica bayesiana (EB) de es donde ,Si tratamos Como la estimación OLS (mínimo cuadrado ordinario) de , entonces el EB la estimación es una suma ponderada de 0 y la estimación OLS, y el peso es una función creciente del tamaño de muestra . La predicción final es dondeui
u^i=σu2σu2+σ2/ni(y¯i.f(x¯i.)),
y¯i.=1niiniyij( ˉ y i.-f( ˉ x i.))Uini f (xij)+ u i, f (xij)f(x¯i.)=1niinif(xij).(y¯i.f(x¯i.))uini
f^(xij)+u^i,
f^(xij) es la estimación del efecto fijo de la regresión lineal o el método de aprendizaje automático como el bosque aleatorio. Esto puede extenderse fácilmente a cualquier nivel de datos, digamos muestras anidadas en ciudades y luego en regiones y países. Además de los métodos basados ​​en árboles, hay un método basado en SVM .

Para el método aleatorio basado en el bosque, puede probar MixRF()en nuestro paquete R MixRFen CRAN.

Randel
fuente
¿Podría explicar por qué la intersección puede variar con , pero tiene un único conjunto de parámetros para todo ? ¿Es una suposición simplificadora evitar el sobreajuste o hacer que el problema sea manejable? f iifi
user20160
@ user20160 Sí, llamamos a la parte como parte de efectos fijos, y como efecto aleatorio. También podemos tener algunas pendientes aleatorias como pero deberíamos limitar el número de pendientes aleatorias porque esto introduciría una gran cantidad de componentes de varianza en la matriz de covarianza de los efectos aleatorios si no está estructurada. u i xfuixijui,
Randel
6

Dado que solo tiene dos variables y un anidamiento directo, me haría eco de los comentarios de otros que mencionan un modelo jerárquico de Bayes. Menciona una preferencia por los métodos basados ​​en árboles, pero ¿hay alguna razón particular para esto? Con un número mínimo de predictores, encuentro que la linealidad es a menudo una suposición válida que funciona bien, y cualquier especificación errónea del modelo podría verificarse fácilmente a través de gráficos residuales.

Si tuviera una gran cantidad de predictores, el ejemplo de RF basado en el enfoque EM mencionado por @Randel sería ciertamente una opción. Otra opción que aún no he visto es utilizar el refuerzo basado en modelos (disponible a través del paquete mboost en R ). Esencialmente, este enfoque le permite estimar la forma funcional de sus efectos fijos utilizando varios aprendices básicos (lineales y no lineales), y las estimaciones de efectos aleatorios se aproximan usando una penalización basada en crestas para todos los niveles en ese factor en particular. Este documento es un tutorial bastante bueno (los alumnos de base de efectos aleatorios se discuten en la página 11).

Eché un vistazo a sus datos de muestra, pero parece que solo tiene las variables de efectos aleatorios de Ciudad, Región y País. En este caso, solo sería útil calcular las estimaciones empíricas de Bayes para esos factores, independientemente de cualquier predictor. En general, podría ser un buen ejercicio para comenzar, ya que tal vez los niveles más altos (País, por ejemplo), tienen una variación mínima explicada en el resultado, por lo que probablemente no valga la pena agregarlos a su modelo.

dmartin
fuente
1
+1 por presentar el mboostpaquete.
Randel
Los datos reales con los que estoy trabajando tienen muchas más de dos variables que agregan mucho desorden del mundo real que no es recogido por mi simple ejemplo (por ejemplo, no linealidad, codependencia, valores perdidos, valores categóricos, etc.) . En mi experiencia, los estudiantes basados ​​en árboles hacen el mejor trabajo al manejar todo el desorden del mundo real, por eso me inclino por usarlos. (Hay una razón por la que XGBoost gana casi todas las competiciones de datos estructurados en Kaggle). mboostSuena interesante: lo echaré un vistazo. Gracias
Ben
1
Ya veo, de acuerdo en que los árboles ciertamente pueden ser útiles en esa situación. En ese caso, seguir con la sugerencia de @ Randel sería una buena opción. Mboost también tiene un aprendiz base en árbol, que podría resultar útil en combinación con los aprendices base de efectos aleatorios.
dmartin el
3

Esto es más un comentario o sugerencia que una respuesta, pero creo que hace una pregunta importante aquí. Como alguien que trabaja exclusivamente con datos multinivel, puedo decir que he encontrado muy poco sobre el aprendizaje automático con datos multinivel. Sin embargo, Dan Martin, un doctorado reciente en psicología cuantitativa en la Universidad de Virginia, hizo su disertación sobre el uso de árboles de regresión con datos multinivel. A continuación hay un enlace a un paquete R que escribió para algunos de estos propósitos:

https://github.com/dpmartin42/mleda/blob/master/README.md

Además, puedes encontrar su disertación aquí:

http://dpmartin42.github.io/about.html

Erik Ruzek
fuente
2
Gracias por la referencia, Erik! Una cosa a tener en cuenta con mi disertación es que solo evaluó cómo los métodos forestales funcionan "fuera de la caja" cuando se exponen a estructuras de datos de niveles múltiples. Los métodos que @Randel mencionó se analizan en el Capítulo 3 como una revisión de la literatura, pero el estudio de simulación investigó principalmente el algoritmo original de Breiman y los árboles / bosques de inferencia condicional.
dmartin
1

La función RFcluster()del paquete gamclass para R "adapta bosques aleatorios para trabajar (aunque de forma torpe e ineficiente) con datos de resultados categóricos agrupados". El siguiente ejemplo es de la página de ayuda para RFcluster:

 library(randomForest)
 library(gamclass)
 data(mlbench::Vowel)
 RFcluster(formula=Class ~., id = V1, data = Vowel, nfold = 15,
           tree=500, progress=TRUE, printit = TRUE, seed = 29)

Esto devuelve una precisión OOB (donde las "bolsas" son bolsas de altavoces, no bolsas de muestras de altavoces individuales), que mi máquina da como 0,57.

John Maindonald
fuente
0

Es posible que desee echar un vistazo a metboost : Miller PJ et al. metboost: análisis de regresión exploratoria con datos agrupados jerárquicamente. arXiv: 1702.03994

Cita del resumen: Proponemos una extensión a los árboles de decisión de decisión potenciados llamada metboost para datos agrupados jerárquicamente. Funciona al limitar la estructura de cada árbol para que sea la misma en todos los grupos, pero permitir que el nodo terminal signifique diferir. Esto permite que los predictores y los puntos divididos conduzcan a diferentes predicciones dentro de cada grupo, y aproxima los efectos específicos no lineales del grupo. Es importante destacar que metboost sigue siendo computacionalmente factible para miles de observaciones y cientos de predictores que pueden contener valores faltantes.

Se implementa en el paquete R mvtboost

Koen Pouwels
fuente
1
proporcione referencias en lugar de solo enlaces (especialmente para su primer enlace), ya que los enlaces pueden morir
Antoine