You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:23