插入符号中的折叠与训练错误

时间:2018-04-10 00:17:40

标签: r r-caret

在模型调优中使用交叉验证,我从caret::train的{​​{1}}对象获得不同的错误率,并在其results对象上自行计算错误。我想了解它们为什么不同,理想情况下如何使用模型选择的错误率,绘制模型性能等。

pred对象包含折叠预测。文档很清楚,pred保存了最佳超参数值的超出预测:“指示应保存每个重采样的保留预测的数量......”最终“保存预测最佳调整参数。“ (保持“所有”预测然后过滤到最佳调整值不能解决问题。)

trainControl(..., savePredictions = "final")文档说train对象是“训练错误率的数据框......”我不确定这意味着什么,但最佳行的值是一致的与results上计算的指标不同。为什么他们有所不同,我怎样才能让他们排队?

pred

reprex package(v0.2.0)创建于2018-04-09。

2 个答案:

答案 0 :(得分:2)

交叉验证的RMSE不是按照您显示的方式计算的,而是针对每个折叠进行计算,然后进行平均计算。完整的例子:

set.seed(1)
d <- data.frame(y = rnorm(50))
d$x1 <- rnorm(50, d$y)
d$x2 <- rnorm(50, d$y)
train_control <- caret::trainControl(method = "cv",
                                     number = 4,
                                     search = "random",
                                     savePredictions = "final")
set.seed(1)
m <- caret::train(x = d[, -1],
                  y = d$y,
                  method = "ranger",
                  trControl = train_control,
                  tuneLength = 3)
#output
Random Forest 

50 samples
 2 predictor

No pre-processing
Resampling: Cross-Validated (4 fold) 
Summary of sample sizes: 37, 38, 37, 38 
Resampling results across tuning parameters:

  min.node.size  mtry  splitrule   RMSE       Rsquared   MAE      
   8             1     extratrees  0.6106390  0.4360609  0.4926629
  12             2     extratrees  0.6156636  0.4294237  0.4954481
  19             2     variance    0.6472539  0.3889372  0.5217369

RMSE was used to select the optimal model using the smallest value.
The final values used for the model were mtry = 1, splitrule = extratrees and min.node.size = 8.

最佳模型的RMSE为0.6106390

现在计算每次折叠和平均值的RMSE:

m$pred %>%
  group_by(Resample) %>%
  mutate(rmse = caret::RMSE(pred, obs)) %>%
  summarise(mean = mean(rmse)) %>%
  pull(mean) %>%
  mean
#output
0.610639

m$pred %>%
  group_by(Resample) %>%
  mutate(rmse = MLmetrics::RMSE(pred, obs)) %>%
  summarise(mean = mean(rmse)) %>%
  pull(mean) %>%
  mean
#output
0.610639

答案 1 :(得分:1)

我得到了不同的结果。这显然是一个随机过程。

MLmetrics::RMSE(m$pred$pred, m$pred$obs)
[1] 0.5824464
> MLmetrics::R2_Score(m$pred$pred, m$pred$obs)
[1] 0.5271595

如果您想要随机(更准确地说,伪随机过程可以重现,那么请在调用之前立即使用set.seed。