나는 의사 결정 트리의 이진 분할의 실제 구현에 대한 호기심 - 그것은 범주 예측의 수준에 관련된 .
특히, 예측 정확도와 안정성을 향상시키기 위해 의사 결정 트리를 사용하여 예측 모델을 작성할 때 일종의 샘플링 방식 (예 : 배깅, 오버 샘플링 등)을 자주 사용합니다. 이러한 샘플링 루틴 동안, 범주 형 변수가 전체 레벨 세트보다 작은 트리 피팅 알고리즘에 제시 될 수 있습니다.
변수 X가 레벨을 차지한다고 가정 해보십시오 {A,B,C,D,E}
. 샘플에는 레벨 만있을 수 있습니다 {A,B,C,D}
. 그리고, 결과 트리가 예측을 위해 사용될 때, 전체 세트가 존재할 수있다.
이 예에서 계속해서 나무가 X에서 쪼개 져서 {A,B}
왼쪽과 {C,D}
오른쪽으로 보냅니다 . 바이너리 분할의 논리는 새로운 데이터에 직면했을 때 "X에 값 A 또는 B가 있으면 왼쪽으로 보내고 그렇지 않으면이 경우를 오른쪽으로 보냅니다"라고 말할 것입니다. 일부 구현에서 발생하는 것으로 보이는 것은 "X에 A 또는 B 값이 있으면 X가 C 또는 D 값을 오른쪽으로 보내면 왼쪽으로 보냅니다"입니다. 이 경우 E 값을 받으면 알고리즘이 작동하지 않습니다.
이진 분할을 처리하는 "올바른"방법은 무엇입니까? 훨씬 더 강력한 방법이 자주 구현되는 것처럼 보이지만 항상 그런 것은 아닙니다 (아래 Rpart 참조).
다음은 몇 가지 예입니다.
Rpart는 실패하고 다른 것은 괜찮습니다.
#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