Cart

決策樹中二分法實現的差異

  • November 6, 2011

我對決策樹中二元拆分的實際實現感到好奇——因為它與分類預測器的級別有關.

具體來說,在使用決策樹構建預測模型時,我經常會使用某種採樣方案(例如裝袋、過採樣等),以提高其預測準確性和穩定性。在這些採樣例程中,分類變量可能會呈現給小於完整水平集的樹擬合算法。

假設變量 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)。

第一類與連續類相同——只是更容易檢查所有樞軸,擴展級別列表也沒有問題。

對於第二個類,您必須創建一組元素,這些元素將被引導到一個分支中,其餘部分留給另一個分支——在這種情況下,您可以:

  1. 拋出錯誤
  2. 假設看不見的課程進入你最喜歡的分支
  3. 將此視為 NA 並以更隨機的方式選擇分支。

現在,直接處理無序因子是很棘手的,所以許多算法“作弊”並聲稱無序因子是有序因子,所以他們甚至沒有觸及這個問題*。其餘的通常使用 int 掩碼,即優化一個整數到並對待-th 位作為因子級別的分支選擇. (有沒有想過為什麼經常限制在 32 個級別?)在這種情況下,看不見的級別很自然地會悄悄地進入“0”分支。然而這似乎不太“正確”,因為我們為什麼要這樣做呢?那麼在屬性選擇中熵槓桿所需的層數呢?

我想說最明智的想法是讓用戶定義完整的因素集(例如 R 有機地做到這一點,通過子集操作保留級別)並使用選項 1. 未聲明的級別和選項 2. 聲明的級別. 如果您已經有一些 NA 處理基礎設施,選項 3. 可能有意義。

*) 還有一種輔助策略是將級別重新編碼為數字,例如 Breiman 編碼——但這會產生更多問題。

引用自:https://stats.stackexchange.com/questions/18004

comments powered by Disqus