決策樹中二分法實現的差異
我對決策樹中二元拆分的實際實現感到好奇——因為它與分類預測器的級別有關.
具體來說,在使用決策樹構建預測模型時,我經常會使用某種採樣方案(例如裝袋、過採樣等),以提高其預測準確性和穩定性。在這些採樣例程中,分類變量可能會呈現給小於完整水平集的樹擬合算法。
假設變量 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
事實上,有兩種類型的因子——有序(如 Tiny < Small < Medium < Big < Huge)和無序(Cucumber、Carrot、Fennel、Aubergine)。
第一類與連續類相同——只是更容易檢查所有樞軸,擴展級別列表也沒有問題。
對於第二個類,您必須創建一組元素,這些元素將被引導到一個分支中,其餘部分留給另一個分支——在這種情況下,您可以:
- 拋出錯誤
- 假設看不見的課程進入你最喜歡的分支
- 將此視為 NA 並以更隨機的方式選擇分支。
現在,直接處理無序因子是很棘手的,所以許多算法“作弊”並聲稱無序因子是有序因子,所以他們甚至沒有觸及這個問題*。其餘的通常使用 int 掩碼,即優化一個整數到並對待-th 位作為因子級別的分支選擇. (有沒有想過為什麼經常限制在 32 個級別?)在這種情況下,看不見的級別很自然地會悄悄地進入“0”分支。然而這似乎不太“正確”,因為我們為什麼要這樣做呢?那麼在屬性選擇中熵槓桿所需的層數呢?
我想說最明智的想法是讓用戶定義完整的因素集(例如 R 有機地做到這一點,通過子集操作保留級別)並使用選項 1. 未聲明的級別和選項 2. 聲明的級別. 如果您已經有一些 NA 處理基礎設施,選項 3. 可能有意義。
*) 還有一種輔助策略是將級別重新編碼為數字,例如 Breiman 編碼——但這會產生更多問題。