gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:01:42 26 4
gpt4 key购买 nike

我正在参加 Coursera 实用机器学习类(class),该类(class)要求使用此 dataset 构建预测模型。根据感兴趣的结果(此处标记为 y,但实际上是 数据集中的 classe 变量):

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”包(建议我它使用这个包作为方法)。然而,时间(插入符要慢得多)和结果非常不同:

方法 1(插入符号):

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 似乎是一个很棒的包,可以统一方法和调用语法,但我现在犹豫是否要使用它。

最佳答案

caret 实际上在幕后做了更多的事情。特别是it uses cross-validation to optimize the model hyperparameters 。在您的情况下,它会尝试 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。如果您想了解更多信息,它有详细的文档,并且作者有一本出色的书《应用预测建模》。

关于r - 为什么使用 caret::train(..., method = "rpart") 的结果与 rpart::rpart(...) 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com