Bir kategorik yordayıcı ilgili olduğu için, bir karar ağacında ikili bir bölünmenin pratik olarak uygulanmasını merak ediyorum .
Özellikle, bir karar ağacı kullanarak öngörücü bir model oluştururken, tahmin doğruluğunu ve kararlılığını artırmak için genellikle bir çeşit örnekleme şemasını (örneğin torbalama, aşırı örnekleme vb.) Kullanacağım. Bu örnekleme rutinleri sırasında, kategorik bir değişkenin, tam seviye setinden daha az bir ağaca uydurma algoritmasına sunulması mümkündür.
Diyelim ki X değişkeni seviyeleri alıyor {A,B,C,D,E}
. Bir örnekte, belki sadece seviyeler {A,B,C,D}
mevcuttur. Sonra, ortaya çıkan ağaç tahmin için kullanıldığında, tam set mevcut olabilir.
Bu örnekten devam edersek, bir ağacın X'e {A,B}
ayrıldığını ve sola ve {C,D}
sağa gönderdiğini varsayalım . İkili bölünmenin mantığının, yeni verilerle karşı karşıya kaldığında şunu söylemesini beklerim: "X'in A veya B değeri varsa, sola gönderin, aksi takdirde bu durumu sağa gönderin". Bazı uygulamalarda gerçekleşen, "X'in A veya B değeri varsa, sola gönderin, X'in C veya D değeri varsa sağa gönderin" dir. Bu durum E değerini aldığında, algoritma bozulur.
İkili bir bölünmenin ele alınmasının "doğru" yolu nedir? Çok daha sağlam bir yolun sıklıkla uygulandığı görülüyor, ancak her zaman değil (bkz. Aşağıdaki Rpart).
İşte birkaç örnek:
Rpart başarısız, diğerleri iyi.
#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