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

9

我正在参加Coursera实践机器学习课程,课程作业要求使用这个数据集构建预测模型。根据感兴趣的结果(标记为y,但实际上是数据集中的classe变量),将数据分割为trainingtesting数据集:

inTrain <- createDataPartition(y = data$y, p = 0.75, list = F) 
training <- data[inTrain, ] 
testing <- data[-inTrain, ] 

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

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

对比。

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

我认为它们会给出相同或非常相似的结果,因为初始方法加载了“rpart”包(这让我想到它使用此包进行方法)。然而,时间(caret 慢得多)和结果却非常不同: 方法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

方法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

从这里您可以看到,第二种方法是更好的分类器-第一种方法在D和E类别上表现非常差。

我意识到这可能不是最合适的地方来问这个问题,但我真的很想更深入地了解这个问题及其相关问题。 caret 似乎是一个很好的包,可以统一这些方法和调用语法,但现在我有些犹豫是否要使用它。

1个回答

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))

此外,您应该为两个模型使用相同的随机种子。
话虽如此,caret提供的额外功能是一件好事,您应该选择使用caret。如果您想了解更多,它有很好的文档,并且作者还有一本杰出的书籍,《应用预测建模》。

非常感谢 @Peyton 的回答 - 非常清晰明了,帮助很大! - Jonny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接