比较插入符号模型对象的最佳功能
Best function to compare caret model objects
我有许多使用相同数据和调整参数的插入符号模型对象。为了完整性检查,我想看看每个方法是否给我相同的模型对象。 (这都是 运行 并行处理并确保我的模型相同的更广泛计划的一部分。)
例如,下面,我训练了2个不同的模型,想进行比较。
当我比较插入符对象时它 returns FALSE。
> library(caret)
>
> set.seed(0)
> myControl <- trainControl(method='cv', index=createFolds(iris$Species))
>
> set.seed(0)
> model1 <- train(Species~., iris, method='rf', trControl=myControl)
>
> set.seed(0)
> model2 <- train(Species~., iris, method='rf', trControl=myControl)
>
> identical(model1,model2)
[1] FALSE
> all.equal(model1,model2)
[1] "Component “times”: Component “everything”: Mean relative difference: 0.09036145"
[2] "Component “times”: Component “final”: Mean relative difference: 0.75"
> compare_models(model1, model2)
One Sample t-test
data: x
t = NaN, df = 9, p-value = NA
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
NaN NaN
sample estimates:
mean of x
0
如果我比较最终模型而不是插入符号对象,它 returns 正确。
> identical(model1$finalModel,model2$finalModel)
[1] TRUE
> all.equal(model1$finalModel,model2$finalModel)
[1] TRUE
所以我想确定为什么插入符号对象不同?或者如果我使用了错误的功能?
我也设置了种子(就像这个例子中的:),但仍然有同样的问题。
更新:
当我交换不同的模型(例如 rpart、lm)然后使用 finalModel 规范时,对于 identical() 调用我得到 FALSE,对于 all.equal() 得到 TRUE。不同型号的使用一定有什么不同吧?
> set.seed(0)
> myControl <- trainControl(method='cv', index=createFolds(iris$Species))
>
> set.seed(0)
> model3 <- train(Species~., iris, method='rpart', trControl=myControl)
>
> set.seed(0)
> model4 <- train(Species~., iris, method='rpart', trControl=myControl)
>
> identical(model3,model4)
[1] FALSE
> all.equal(model3,model4)
[1] "Component “times”: Component “everything”: Mean relative difference: 0.05063291"
[2] "Component “times”: Component “final”: Mean relative difference: 1"
> compare_models(model3, model4)
One Sample t-test
data: x
t = NaN, df = 9, p-value = NA
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
NaN NaN
sample estimates:
mean of x
0
>
> identical(model3$finalModel,model4$finalModel)
[1] FALSE
> all.equal(model3$finalModel,model4$finalModel)
[1] TRUE
train()
存储 运行 函数的执行时间,参见 model1$times
和 ?train
。我认为这些时间与您的目的无关,因此您可以放心地忽略它们:
all.equal(model1[!names(model1) %in% "times"], model2[!names(model2) %in% "times"])
我有许多使用相同数据和调整参数的插入符号模型对象。为了完整性检查,我想看看每个方法是否给我相同的模型对象。 (这都是 运行 并行处理并确保我的模型相同的更广泛计划的一部分。)
例如,下面,我训练了2个不同的模型,想进行比较。
当我比较插入符对象时它 returns FALSE。
> library(caret)
>
> set.seed(0)
> myControl <- trainControl(method='cv', index=createFolds(iris$Species))
>
> set.seed(0)
> model1 <- train(Species~., iris, method='rf', trControl=myControl)
>
> set.seed(0)
> model2 <- train(Species~., iris, method='rf', trControl=myControl)
>
> identical(model1,model2)
[1] FALSE
> all.equal(model1,model2)
[1] "Component “times”: Component “everything”: Mean relative difference: 0.09036145"
[2] "Component “times”: Component “final”: Mean relative difference: 0.75"
> compare_models(model1, model2)
One Sample t-test
data: x
t = NaN, df = 9, p-value = NA
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
NaN NaN
sample estimates:
mean of x
0
如果我比较最终模型而不是插入符号对象,它 returns 正确。
> identical(model1$finalModel,model2$finalModel)
[1] TRUE
> all.equal(model1$finalModel,model2$finalModel)
[1] TRUE
所以我想确定为什么插入符号对象不同?或者如果我使用了错误的功能?
我也设置了种子(就像这个例子中的:),但仍然有同样的问题。
更新: 当我交换不同的模型(例如 rpart、lm)然后使用 finalModel 规范时,对于 identical() 调用我得到 FALSE,对于 all.equal() 得到 TRUE。不同型号的使用一定有什么不同吧?
> set.seed(0)
> myControl <- trainControl(method='cv', index=createFolds(iris$Species))
>
> set.seed(0)
> model3 <- train(Species~., iris, method='rpart', trControl=myControl)
>
> set.seed(0)
> model4 <- train(Species~., iris, method='rpart', trControl=myControl)
>
> identical(model3,model4)
[1] FALSE
> all.equal(model3,model4)
[1] "Component “times”: Component “everything”: Mean relative difference: 0.05063291"
[2] "Component “times”: Component “final”: Mean relative difference: 1"
> compare_models(model3, model4)
One Sample t-test
data: x
t = NaN, df = 9, p-value = NA
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
NaN NaN
sample estimates:
mean of x
0
>
> identical(model3$finalModel,model4$finalModel)
[1] FALSE
> all.equal(model3$finalModel,model4$finalModel)
[1] TRUE
train()
存储 运行 函数的执行时间,参见 model1$times
和 ?train
。我认为这些时间与您的目的无关,因此您可以放心地忽略它们:
all.equal(model1[!names(model1) %in% "times"], model2[!names(model2) %in% "times"])