为什么使用 caret::train(..., method = "rpart") 的结果与 rpart::rpart(...) 不同?
Why do results using caret::train(..., method = "rpart") differ from rpart::rpart(...)?
我正在参加 Coursera 实用机器学习课程,课程作业需要使用此 dataset 构建预测模型。将数据拆分为 training
和 testing
数据集后,根据感兴趣的结果(此处标记为 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' 包(向我建议它使用这个包作为方法)。但是,时间安排(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
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
如您所见,第二种方法是更好的分类器 - 第一种方法对于 类 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
。如果你想了解更多,它有详细的文档,作者有一本很棒的书,Applied Predictive Modeling。
我正在参加 Coursera 实用机器学习课程,课程作业需要使用此 dataset 构建预测模型。将数据拆分为 training
和 testing
数据集后,根据感兴趣的结果(此处标记为 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' 包(向我建议它使用这个包作为方法)。但是,时间安排(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
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
如您所见,第二种方法是更好的分类器 - 第一种方法对于 类 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
。如果你想了解更多,它有详细的文档,作者有一本很棒的书,Applied Predictive Modeling。