9

我正在参加 Coursera Practical Machine Learning 课程,课程作业需要使用此数据集构建预测模型。将数据拆分为trainingtesting数据集后,根据感兴趣的结果(此处标记为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似乎是一个统一方法和调用语法的好包,但我现在犹豫要不要使用它。

4

1 回答 1

8

caret实际上在引擎盖下做得更多。特别是,它使用交叉验证来优化模型超参数。在您的情况下,它会尝试三个值cp(typemodFit并且您将看到每个值的准确度结果),而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。

于 2015-03-20T16:41:34.810 回答