Tôi tò mò về việc triển khai thực tế phân chia nhị phân trong cây quyết định - vì nó liên quan đến các cấp độ của một công cụ dự đoán phân loại .
Cụ thể, tôi thường sẽ sử dụng một số loại sơ đồ lấy mẫu (ví dụ: đóng bao, quá khổ, v.v.) khi xây dựng mô hình dự đoán bằng cây quyết định - để cải thiện độ chính xác và ổn định dự đoán của nó. Trong các thói quen lấy mẫu này, có thể đưa ra một biến phân loại cho thuật toán khớp cây với ít hơn mức hoàn chỉnh.
Nói một biến X mất trên các cấp {A,B,C,D,E}
. Trong một mẫu, có thể chỉ có các cấp độ {A,B,C,D}
. Sau đó, khi cây kết quả được sử dụng để dự đoán, toàn bộ có thể có mặt.
Tiếp tục từ ví dụ này, giả sử một cây tách ra trên X và gửi {A,B}
sang trái và {C,D}
phải. Tôi sẽ mong đợi logic của phân tách nhị phân sẽ nói, khi phải đối mặt với dữ liệu mới: "Nếu X có giá trị A hoặc B, hãy gửi sang bên trái, nếu không, hãy gửi trường hợp này sang bên phải". Điều dường như xảy ra trong một số triển khai là "nếu X có giá trị A hoặc B, hãy gửi sang bên trái, nếu X có giá trị C hoặc D gửi sang bên phải". Khi trường hợp này nhận giá trị E, thuật toán bị hỏng.
Cách "đúng" để phân chia nhị phân được xử lý là gì? Có vẻ như cách mạnh mẽ hơn nhiều được thực hiện thường xuyên, nhưng không phải lúc nào cũng vậy (xem Rpart bên dưới).
Dưới đây là một vài ví dụ:
Rpart thất bại, những người khác là 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