我一直在尝试确保使用CHAID软件包中实现的CHAID算法获得的分类树将生成一棵带有至少minbucket
个观察值的终端节点(叶)的树。根据chaid过程的描述,这可以通过指定chaid_control
函数来完成:
chaid_control(alpha2 = 0.05, alpha3 = -1, alpha4 = 0.05,
minsplit = 20, minbucket = 7, minprob = 0.01,
stump = FALSE, maxheight = -1)
这类似于控制rpart软件包中的树的行为。
但是,设置
minbucket
参数似乎对结果树的最终形状没有任何影响。这是一个例子:library("CHAID")
set.seed(290875)
USvoteS <- USvote[sample(1:nrow(USvote), 1000),]
chaid(vote3 ~ ., data = USvoteS)
Model formula:
vote3 ~ gender + ager + empstat + educr + marstat
Fitted party:
[1] root
| [2] marstat in married
| | [3] educr <HS, HS, >HS: Gore (n = 311, err = 49.5%)
| | [4] educr in College, Post Coll: Bush (n = 249, err = 35.3%)
| [5] marstat in widowed, divorced, never married
| | [6] gender in male: Gore (n = 159, err = 47.8%)
| | [7] gender in female
| | | [8] ager in 18-24, 25-34, 35-44, 45-54: Gore (n = 127, err = 22.0%)
| | | [9] ager in 55-64, 65+: Gore (n = 115, err = 40.9%)
Number of inner nodes: 4
Number of terminal nodes: 5
终端节点3、4、6、8和9分别包含311、249、159、127和115个观测值。现在,通常为了限制最少的观察数,应按以下步骤进行:
ctrl <- chaid_control(minbucket = 200)
不过,调用
chaid(vote3 ~ ., data = USvoteS, control = ctrl)
产生与以前相同的树(而不是具有至少200个观测值的节点的树)。
我不确定是我犯错还是在
chaid
过程的执行中遗漏了什么... 最佳答案
每个终端节点中观察的最小数量由minbucket
和minprob
控制。前者给出了观测值的绝对数量,后者给出了相对频率(相对于当前节点的样本大小)。在内部,在每个节点中使用两个数量中的最小值。这对我来说也是违反直觉的,因为我本来希望使用最大值。但是我没有检查是否以这种方式描述了原始的CHAID算法。
如果要确保只有minbucket
控制最小节点大小,请设置minbucket = 200, minprob = 1
。