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