决策树中二进制拆分的实现差异


12

我对决策树中二进制拆分的实际实现感到好奇-因为它与分类预测变量级别有关。Xj

具体来说,在使用决策树构建预测模型时,我经常会使用某种采样方案(例如装袋,过采样等),以提高其预测准确性和稳定性。在这些采样例程中,可以将类别变量以小于完整级别集的形式显示给树拟合算法。

假设变量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

Answers:


9

实际上,有两种类型的因素-有序的(例如Tiny <小<中<大<巨大)和无序的(黄瓜,胡萝卜,茴香,茄子)。
头等舱与连续舱相同-仅需更轻松地检查所有枢轴,扩展级别列表也没有问题。
对于第二类,您必须制作一组将在一个分支中定向的元素,而将其余部分留在另一个分支中–在这种情况下,您可以:

  1. 抛出错误
  2. 假设看不见的课程进入您最喜欢的分支
  3. 将其视为NA并以较少的随机方式选择分支。

现在,直接处理无序因子非常棘手,因此许多算法“作弊”,并声称无序因子为有序因子,因此它们甚至都不会解决这个问题*。其余的通常使用int掩码,即优化从到的整数,并将第位作为因子级别的分支选择。(曾经想知道为什么经常限制到32个级别?)在这种设置下,看不见的级别静默进入“ 0”分支是很自然的。但这似乎不太“正确”,因为我们为什么真的应该这样做?在属性选择中熵杠杆作用所需的级别数又如何呢?12#categories11ii

我想说的最明智的想法是让用户定义所有因素集(例如R通过有机方式做到这一点,通过子集操作来保留级别),并对未声明的级别使用选项1,对于已声明的级别使用选项2。 。如果您已经具有一些NA处理基础结构,则选项3可能有意义。

*)还有另一种策略可以将级别进行一些非平凡的重新编码为数字,例如Br​​eiman编码-但这会产生更多问题。


1
您是否在说我的示例中的ctree或tree实际上将此无序因子视为有序因子,然后将其发送到“ 0”分支中?
B_Miner 2011年

@mbq您能解释一下为什么拆分的总数为2 ^(#categories + 1)-2吗?我不太明白为什么“ -2”部分。
honeybadger

嗯,看来我搞砸了这个公式。这里有2 ^ n个n位单词,但是我们不同时考虑单词a和〜a,所以2 ^(n-1),而且我们不喜欢根本不会溢出的拆分,所以2 ^(n-1)-1(换句话说,我们从1开始计数)。那么n = 1是一种特殊情况。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.