rpart给出相同的交叉验证结果,没有CV

问题描述 投票:0回答:1

就像标题所说的那样,我正在尝试使用R中的rpart包使用和不使用交叉验证运行决策树。我正在使用xval参数执行此操作,如插图(https://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf)中所述

不幸的是,无论有没有CV,我都会得到同样的树。我已经比较了每个的计算时间和CV模型看起来需要大约10倍的时间,所以它显然做了一些事情,我只是无法弄清楚是什么。

我还使用不同的复杂度参数多次重做模型,但它没有任何区别。

这是显示我的问题的示例代码,printcp显示相同的结果,并且来自训练和保持集的预测都是相同的。

library(rpart)
library(caret)

abalone <- read.csv(file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data',header = FALSE)
names(abalone) <- c("sex", "length", "diameter", "height", "whole_weight", "shucked_weight", "viscera_weight", "shell_weight", "rings") 

train_set <- createDataPartition(abalone$sex, times = 1, p = 0.8, list = FALSE)

abalone_train <- slice(abalone, train_set)
abalone_test <- slice(abalone, -train_set)

abalone_fit_noCV <- rpart(sex ~ ., 
                     data = abalone_train, 
                     method = "class", 
                     parms = list(split = 'information'),
                     control = rpart.control(xval = 0,
                                             cp = 0.005)) 

abalone_fit_CV <- rpart(sex ~ ., 
                        data = abalone_train, 
                        method = "class", 
                        parms = list(split = 'information'),
                        control = rpart.control(xval = 10,
                                                cp = 0.005))

printcp(abalone_fit_noCV)
printcp(abalone_fit_CV)

CV_pred <- predict(abalone_fit_CV, type = "class")
noCV_pred <- predict(abalone_fit_noCV, type = "class")
confusionMatrix(CV_pred, noCV_pred)

CV_pred <- predict(abalone_fit_CV, abalone_test, type = "class")
noCV_pred <- predict(abalone_fit_noCV, abalone_test, type = "class")
confusionMatrix(CV_pred, noCV_pred)
r cross-validation rpart
1个回答
0
投票

在真正的初学者时尚,我在发布后不久就想到了这一点。

对于遇到这个问题的其他人来说,它基本上是在Cross Validated 上回答的:

返回的最后一棵树仍然是初始树。您必须使用交叉验证图使用剪枝功能来选择最佳子树。

如果您阅读vignette的完整修剪树部分,而不仅仅是交叉验证部分,这一点很清楚。

© www.soinside.com 2019 - 2024. All rights reserved.