Algoritmo de árbol de regresión con modelos de regresión lineal en cada hoja.

14

Versión corta: estoy buscando un paquete R que pueda construir árboles de decisión, mientras que cada hoja en el árbol de decisión es un modelo de regresión lineal completo. AFAIK, la biblioteca rpartcrea árboles de decisión donde la variable dependiente es constante en cada hoja. ¿Hay otra biblioteca (o una rpartconfiguración que no conozca) que pueda construir tales árboles?

Versión larga: estoy buscando un algoritmo que construya un árbol de decisión basado en un conjunto de datos de entrenamiento. Cada decisión en el árbol divide el conjunto de datos de entrenamiento en dos partes, de acuerdo con una condición en una de las variables independientes. La raíz del árbol contiene el conjunto de datos completo, y cada elemento del conjunto de datos está contenido exactamente en un nodo hoja.

El algoritmo es así:

  1. Comience con el conjunto de datos completo, que es el nodo raíz del árbol. Elija este nodo y llámelo N .
  2. Crear un modelo de regresión lineal de los datos de N .
  3. Si R2 del modelo lineal de N es más alto que algún umbral θR2 , entonces hemos terminado con N , entonces marqueN como una hoja y salte al paso 5.
  4. Pruebe n decisiones aleatorias y elija la que produzca el mejor R2 en los subnodos:
    • Elija una variable independiente aleatoria vi , así como un umbral aleatorio θi .
    • La decisión divide el conjunto de datos de N en dos nuevos nodos, N y ~ NviθiNN^N~ .
    • Crear modelos de regresión lineal en ambos N y ~ N , y calcular su R 2 (llamada de ellos r y ~ r ).N^N~R2r^r~
    • De todos esos tuplas ( v i , θ i , r , ~ r ) , seleccione el que con la máxima m i n ( r , ~ r ) . Esto produce una nueva decisión en el árbol, y N tiene dos nuevos subnodos N y ~ N .n(vi,θi,r^,r~)min(r^,r~)NN^N~
  5. Tenemos procesamiento acabada . Elija un nuevo nodo N que aún no se haya procesado y vuelva al paso 2. Si todos los nodos se han procesado, el algoritmo finaliza.NN

Esto construirá recursivamente un árbol de decisión que divide los datos en partes más pequeñas y calcula un modelo lineal en cada una de esas partes.

El paso 3 es la condición de salida, que evita que el algoritmo se sobreajuste. Por supuesto, hay otras posibles condiciones de salida:

  • Salga si la profundidad de en el árbol está por encima de θ d e p t hNθdepth
  • Salga si el conjunto de datos en es menor que θ d a t a s e tNθdataset

¿Existe tal algoritmo en un paquete R?

cheesus dice que dejen de disparar mods
fuente
44
Eche un vistazo al paquete de la fiesta y vea si esto se adapta a sus necesidades. Puede manejar varios tipos de modelos en los nodos de árboles IIRC.
Restablecer Monica - G. Simpson

Respuestas:

11

Si bien funcionan de manera diferente a su algoritmo, creo que encontrará interesantes mob () y FTtree. Para la mafia de Zeileis, visite http://cran.r-project.org/web/packages/party/vignettes/MOB.pdf Para FTtree, los árboles funcionales de Gama, una implementación está disponible en Weka y, por lo tanto, en RWeka. Ver http://cran.r-project.org/web/packages/RWeka/index.html para más detalles.

Momo
fuente
1
+1 para mob, que permite conectar casi cualquier modelo al marco de partición recursivo
etov
8

El paquete RWeka ofrece muchos métodos de regresión. Entre ellos, puede encontrar M5P (M5 Prime), que es exactamente un modelo de regresión basado en árboles con ecuaciones lineales en las hojas. Para más detalles sobre el método M5, consulte la publicación .

Un código de ejemplo sería:

library(RWeka)
M5_model = M5P (Dep_var ~ ., data = train, control = Weka_control(N=F, M=10))
train_predicted = predict(M5_model, train)
test_predicted = predict(M5_model, test)

Si desea utilizar el conjunto de ensacado con el método M5, intente algo como:

M5_bag = Bagging(Dep_var ~ ., data = train, control = Weka_control(P=100, I = 100, W = list("weka.classifiers.trees.M5P", M = 4)))

Para ver las opciones de control para el modelo M5P, intente:

WOW(M5P)

Si desea optimizar el método M5, hay una solución para eso en el caretpaquete:

library(caret)
Optimization = train (Dep_var ~ .,data = train, method = 'M5')
JerryTheForester
fuente