Karar ağaçlarında ikili bölünmeler uygulama farkı


12

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 .Xj

Ö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

Yanıtlar:


9

Aslında iki tür faktör vardır - sıralı (Küçük <Küçük <Orta <Büyük <Büyük) ve sırasız (Salatalık, Havuç, Rezene, Patlıcan gibi).
Birinci sınıf sürekli olanlarla aynıdır - sadece tüm pivotları kontrol etmek daha kolaydır, ayrıca genişletme seviyeleri listesi ile ilgili bir sorun yoktur.
İkinci sınıf için, bir dalda yönlendirilecek ve geri kalanını diğer tarafa bırakacak bir dizi öğe yapmanız gerekir - bu durumda aşağıdakilerden birini yapabilirsiniz:

  1. atış hatası
  2. Görünmeyen sınıfın en sevdiğiniz şubeye girdiğini varsayalım
  3. bunu NA olarak kabul edin ve dalı daha az rastgele bir şekilde seçin.

12#categories-1-1benben

En mantıklı fikir, kullanıcının tüm faktörleri tanımlamasını (örneğin R bunu organik olarak yapar, alt küme işlemleri yoluyla seviyeleri koruyarak) tanımlamak ve beyan edilmemiş seviyeler için 1. seçeneği ve beyan edilenler için 2. seçeneği kullanmak olduğunu söyleyebilirim. . Zaten NA işleme altyapınız varsa Seçenek 3 anlamlı olabilir.

*) Seviyelerin önemsiz olmayan bazı yeniden kodlamalarını, örneğin Breiman kodlaması gibi sayılara dönüştürmek için yan strateji de vardır - ancak bu daha da fazla sorun yaratır.


1
Örneğimdeki ctree veya ağacın aslında bu düzensiz faktöre sıralı bir faktör olarak davrandığını ve böylece "0" dalına gönderdiğini mi söylüyorsunuz?
B_Miner

@mbq lütfen bölmeleri yapabileceğiniz toplam yol sayısının neden 2 ^ (# kategori + 1) - 2 olduğunu açıklayabilir misiniz?
honeybadger

Hmm, bu formülü berbat ettim; 2 ^ n n-bit kelime var, ama hem a hem de ~ a kelimelerini saymıyoruz, bu yüzden 2 ^ (n-1) ve hiç dökülmemiş bölünmeleri sevmiyoruz, yani 2 ^ (n-1) -1 (diğer bir deyişle 1'den sayıyoruz). n = 1 özel bir durumdur.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.