Ich bin gespannt auf die praktische Umsetzung einer binären Aufteilung in einem Entscheidungsbaum - bezogen auf Ebenen eines kategorialen Prädiktors .
Insbesondere verwende ich beim Erstellen eines Vorhersagemodells unter Verwendung eines Entscheidungsbaums oft ein Stichprobenverfahren (z. B. Absacken, Überstichproben usw.), um die Genauigkeit und Stabilität der Vorhersage zu verbessern. Während dieser Abtastroutinen ist es möglich, dass eine kategoriale Variable einem Baumanpassungsalgorithmus mit weniger als der vollständigen eingestellten Ebene präsentiert wird.
Angenommen, eine Variable X nimmt Ebenen an {A,B,C,D,E}
. In einer Stichprobe sind möglicherweise nur Ebenen {A,B,C,D}
vorhanden. Wenn dann der resultierende Baum zur Vorhersage verwendet wird, kann der vollständige Satz vorhanden sein.
Wenn Sie mit diesem Beispiel fortfahren, sagen Sie, ein Baum teilt sich in X und sendet {A,B}
nach links und {C,D}
rechts. Ich würde erwarten, dass die Logik der binären Aufteilung dann sagt, wenn sie mit neuen Daten konfrontiert wird: "Wenn X den Wert A oder B hat, sende nach links, andernfalls sende diesen Fall nach rechts". In einigen Implementierungen scheint Folgendes zu passieren: "Wenn X den Wert A oder B hat, nach links senden, wenn X den Wert C oder D hat, nach rechts senden". Wenn dieser Fall den Wert E annimmt, bricht der Algorithmus zusammen.
Was ist der "richtige" Weg, um einen binären Split zu handhaben? Es scheint, dass die viel robustere Methode oft, aber nicht immer implementiert wird (siehe Rpart unten).
Hier einige Beispiele:
Rpart schlägt fehl, die anderen sind ok.
#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