就像标题中所说的那样,我正在尝试使用R中的rpart包在交叉验证和不交叉验证的情况下运行决策树。我正在使用xval参数执行此操作,如小插图中所述({{3 }})
不幸的是,无论有没有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)
答案 0 :(得分:0)
以真正的初学者方式,我在发布后不久就想到了这一点。
对于其他遇到此问题的人,基本上可以在Cross Validated 上得到回答:
返回的最终树仍然是初始树。您必须使用带有交叉验证图的修剪功能来选择最佳子树。
如果您阅读了vignette的完整的修剪树部分,而不仅仅是交叉验证部分,则很清楚。