使用tree包构建回归树时10折交叉验证报错求助
解决tree包10折交叉验证的长度不匹配问题
问题原因
你遇到的是tree包在回归树交叉验证中的常见提示(会影响结果可靠性),根源是训练集样本数(253个)无法被k=10整除,导致部分交叉验证折的树复杂度(节点数量)不一致,计算验证偏差时出现cvdev与plearn$dev长度不匹配的情况。
解决方案
方案1:调整训练集样本数
将训练集样本数改为能被10整除的数值,比如250:
data(Boston) # from ISLR2 package set.seed(1) # 取250个训练样本,可被10整除 train.ind <- sample(1:nrow(Boston), 250) train <- Boston[train.ind,] test <- Boston[-train.ind,] tree.boston <- tree(medv~., data = train) set.seed(1) cv.boston <- cv.tree(tree.boston, k=10)
方案2:换用rpart包(更稳定的树模型工具)
rpart包的交叉验证逻辑更健壮,适配非整除样本量的场景:
library(rpart) data(Boston) set.seed(1) train.ind <- sample(1:nrow(Boston), nrow(Boston)/2) train <- Boston[train.ind,] test <- Boston[-train.ind,] # 构建带10折交叉验证的回归树 tree.boston <- rpart(medv~., data = train, control = rpart.control(xval=10)) # 查看交叉验证结果 printcp(tree.boston)
方案3:用caret包封装交叉验证
caret包提供统一的交叉验证接口,适配多数模型:
library(caret) data(Boston) set.seed(1) train.ind <- sample(1:nrow(Boston), nrow(Boston)/2) train <- Boston[train.ind,] # 设置10折交叉验证参数 train_control <- trainControl(method="cv", number=10) # 训练回归树并执行交叉验证 tree_cv <- train(medv~., data=train, method="tree", trControl=train_control) # 输出验证结果 print(tree_cv)
内容的提问来源于stack exchange,提问作者mj10
相关产品推荐
相关产品推荐

