使用rpart与attrition数据集:仅OverTime变量时决策树无法分裂问题咨询
我来帮你理清这个问题的根源和解决办法——这种情况其实是rpart的默认参数在“把关”,咱们一步步拆解:
为什么单独用OverTime时无法分裂?
rpart默认使用的cp(复杂度参数)是0.01,这个参数的作用是:只有当分裂带来的模型复杂度减少比例超过1%时,才会保留这个分裂节点。当你只使用OverTime这一个变量时,它对Attrition的预测增益刚好没达到默认的cp=0.01阈值,所以rpart直接返回了根节点,认为没必要分裂。
而当你加入JobRole后,模型的整体结构发生了变化:OverTime的分裂增益在和JobRole结合评估时,满足了cp的要求,所以被保留作为第一个分裂节点。
解决办法:调整rpart的复杂度参数
你只需要降低cp的值,让模型更容易接受增益较小的分裂,就能得到基于OverTime的分裂节点了。下面是具体的代码示例:
1. 直接用rpart函数调整cp
library(rsample) library(rpart) data(attrition) # 把cp设为更小的值,比如0.001 tree_overtime <- rpart(Attrition ~ OverTime, data = attrition, cp = 0.001) # 查看树结构 print(tree_overtime) # 可视化树(需要rpart.plot包) library(rpart.plot) rpart.plot(tree_overtime)
2. 用caret的train函数调整cp
caret的train默认也会沿用rpart的cp默认值,所以你需要通过tuneGrid指定更小的cp范围来搜索最优值:
library(caret) # 设置交叉验证控制 ctrl <- trainControl(method = "cv", number = 5) # 定义cp的搜索范围 tune_grid <- expand.grid(cp = seq(0, 0.01, by = 0.001)) # 训练模型 caret_tree <- train(Attrition ~ OverTime, data = attrition, method = "rpart", trControl = ctrl, tuneGrid = tune_grid) # 查看最终模型 print(caret_tree$finalModel)
额外验证:确认OverTime和Attrition的关联
你也可以先通过统计检验确认两者的相关性,比如卡方检验:
chisq.test(attrition$Attrition, attrition$OverTime)
如果检验结果显著,说明两者确实有关联,只是rpart的默认参数太严格,没让分裂发生。
内容的提问来源于stack exchange,提问作者sdevine188
相关产品推荐
相关产品推荐

