12 votos

Diferencia en la aplicación de divisiones binarias en árboles de decisión

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

9voto

ESRogs Puntos 1381

De hecho, hay dos tipos de factores-ordenado (como Diminutos < < Medio < Big < Enorme) y desordenada (Pepino, Zanahoria, Hinojo, Berenjenas).
La primera clase es la misma que continua, no sólo es más fácil comprobar todos los pivotes, también no hay problema con la extensión de los niveles de la lista.
Para la segunda clase, tiene que hacer un conjunto de elementos que serán dirigidos en una rama, dejando el resto en el otro-en este caso, usted puede:

  1. tirar error
  2. suponga que invisible de clase que pasa en tu sucursal favorita
  3. tratar esto como NA y seleccionar la sucursal en más-menos de forma aleatoria.

Ahora, directa el tratamiento de desordenada de los factores es complicado, así que muchos de los algoritmos de "hacer trampa" y afirman desordenada factores como pedidos, por lo que incluso no toque este problema*. El resto suele usar int máscara, es decir, optimizar un número entero de $1$ $2^{\text{#categories}+1}-2$(o $0$$2^{\text{#categories}+1}-1$) y el tratamiento de $i$-ésimo bit como una rama de selección para un nivel de factor de $i$. (Alguna vez se preguntó por qué no es frecuente límite de 32 niveles?) En este contexto, es muy natural que a niveles nunca vistos ir en silencio en "0" de la rama. Sin embargo, esto no parece demasiado "bien", porque ¿por qué realmente debemos hacer esto? ¿Y qué sobre el número de niveles requeridos para la entropía de apalancamiento en la selección de atributos?

Yo diría que la más sensata idea es hacer que el usuario defina el conjunto completo de factores (por ejemplo, la R de este orgánicamente, la preservación de los niveles a través de subconjunto de las operaciones) y use la opción 1. para los no-declaró niveles y la opción 2. por haberse declarado. Opción 3. puede tener sentido si usted ya tiene algunos NA el manejo de la infraestructura.

*) Existe también la estrategia para hacer algunas no trivial de la re-codificación de los niveles en los números, como por ejemplo Breiman de codificación; sin embargo, esto genera aún más los problemas.

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:

X