为什么使用caret :: train(...,method ="rpart")的结果与rpart :: rpart(...)不同?

Jon*_*nny 8 r rpart r-caret

我正在参加Coursera实践机器学习课程,课程作业需要使用此数据集构建预测模型.将数据分成后trainingtesting数据集的基础上,感兴趣的结果(本文件标记y,但实际上是在classe数据集中的变量):

inTrain <- createDataPartition(y = data$y, p = 0.75, list = F) 
training <- data[inTrain, ] 
testing <- data[-inTrain, ] 
Run Code Online (Sandbox Code Playgroud)

我尝试了两种不同的方法:

modFit <- caret::train(y ~ ., method = "rpart", data = training)
pred <- predict(modFit, newdata = testing)
confusionMatrix(pred, testing$y)
Run Code Online (Sandbox Code Playgroud)

modFit <- rpart::rpart(y ~ ., data = training)
pred <- predict(modFit, newdata = testing, type = "class")
confusionMatrix(pred, testing$y)
Run Code Online (Sandbox Code Playgroud)

我假设它们会给出相同或非常相似的结果,因为初始方法加载'rpart'包(建议我使用此包用于该方法).但是,时间(caret慢得多)和结果是非常不同的:

Method 1 (caret):

Confusion Matrix and Statistics

Reference
Prediction    A    B    C    D    E
         A 1264  374  403  357  118
         B   25  324   28  146  124
         C  105  251  424  301  241
         D    0    0    0    0    0
         E    1    0    0    0  418
Run Code Online (Sandbox Code Playgroud)

Method 2 (rpart):

Confusion Matrix and Statistics

Reference 
Prediction    A    B    C    D    E
         A 1288  176   14   79   25
         B   36  569   79   32   68
         C   31   88  690  121  113
         D   14   66   52  523   44
         E   26   50   20   49  651
Run Code Online (Sandbox Code Playgroud)

如您所见,第二种方法是更好的分类器 - 对于D&E类,第一种方法非常差.

我意识到这可能不是提出这个问题的最合适的地方,但我真的很感激对这个问题和相关问题有了更多的了解.caret看起来像是一个统一方法和调用语法的好方法,但我现在对使用它犹豫不决.

Pey*_*ton 8

caret实际上在引擎盖下做了相当多的事情.特别是,它使用交叉验证来优化模型超参数.在你的情况下,它尝试三个值cp(类型modFit,你会看到每个值的准确性结果),而rpart只是使用0.01,除非你告诉它(参见?rpart.control).交叉验证也需要更长时间,尤其是caret默认情况下使用自举.

为了获得类似的结果,您需要禁用交叉验证并指定cp:

modFit <- caret::train(y ~ ., method = "rpart", data = training,
                       trControl=trainControl(method="none"),
                       tuneGrid=data.frame(cp=0.01))
Run Code Online (Sandbox Code Playgroud)

此外,您应该为两个模型使用相同的随机种子.

也就是说,caret提供的额外功能是一件好事,你可能应该选择caret.如果你想了解更多,那就有很好的文献记录,作者有一本很棒的书,应用预测建模.