カテゴリー予測変数レベルに関連するため、決定ツリーでのバイナリ分割の実用的な実装に興味があります。
具体的には、意思決定ツリーを使用して予測モデルを構築するときに、予測精度と安定性を向上させるために、ある種のサンプリングスキーム(バギング、オーバーサンプリングなど)をよく利用します。これらのサンプリングルーチン中に、カテゴリ変数が完全なレベルセットよりも少ないツリーフィッティングアルゴリズムに提示される可能性があります。
変数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