Tengo curiosidad acerca de la aplicación práctica de una división binaria en un árbol de decisión - como se relaciona con los niveles de un predictores categóricos $X{j}$.
Específicamente, a menudo se utiliza algún tipo de plan de muestreo (por ejemplo, embolsado, la corrección, etc) cuando la construcción de un modelo predictivo usando un árbol de decisión - con el fin de mejorar su precisión predictiva y la estabilidad. Durante estos extracción de las muestras, es posible que una variable categórica para ser presentado a un árbol de montaje algoritmo con menos que el nivel completo conjunto.
Decir que una variable X toma los niveles de {A,B,C,D,E}
. En una muestra, tal vez sólo los niveles de {A,B,C,D}
están presentes. Entonces, cuando el árbol resultante se utiliza para la predicción, el conjunto puede estar presente.
Continuando con este ejemplo, dicen que un árbol se divide en función de X y envía {A,B}
a la izquierda y {C,D}
a la derecha. Yo esperaría que la lógica de la división binaria para que luego digan, cuando se enfrentan con nuevos datos: "Si X tiene el valor de a o B, enviar a la izquierda, de lo contrario, enviar este caso a la derecha". Lo que parece ocurrir en algunas implementaciones es "si X tiene el valor de a o B, enviar a la izquierda, si X tiene un valor de C o D enviar a la derecha". Cuando este caso toma el valor de E, el algoritmo se rompe.
¿Cuál es la forma "correcta" para un binario split para ser manejado? Se parece mucho más robusto forma en que se implementa a menudo, pero no siempre (ver Rpart a continuación).
Aquí hay un par de ejemplos:
Rpart falla, los demás están bien.
#test trees and missing values
summary(solder)
table(solder$PadType)
# create train and validation
set.seed(12345)
t_rows<-sample(1:nrow(solder),size=360, replace=FALSE)
train_solder<-solder[t_rows,]
val_solder<-solder[-t_rows,]
#look at PadType
table(train_solder$PadType)
table(val_solder$PadType)
#set a bunch to missing
levels(train_solder$PadType)[train_solder$PadType %in% c('L8','L9','W4','W9')] <- 'MISSING'
#Fit several trees, may have to play with the parameters to get them to split on the variable
####RPART
mod_rpart<-rpart(Solder~PadType,data=train_solder)
predict(mod_rpart,val_solder)
#Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = attr(object, :
#factor 'PadType' has new level(s) D6, L6, L7, L8, L9, W4
####TREE
mod_tree<-tree(Solder~PadType,data=train_solder,split="gini")
predict(mod_tree,val_solder) #works fine
####ctree
mod_ctree<-ctree(Solder~PadType,data=train_solder,control = ctree_control(mincriterion = 0.05))
predict(mod_ctree,val_solder) #works fine