在模型调优中使用交叉验证,我从caret::train
的{{1}}对象获得不同的错误率,并在其results
对象上自行计算错误。我想了解它们为什么不同,理想情况下如何使用模型选择的错误率,绘制模型性能等。
pred
对象包含折叠预测。文档很清楚,pred
保存了最佳超参数值的超出预测:“指示应保存每个重采样的保留预测的数量......”最终“保存预测最佳调整参数。“ (保持“所有”预测然后过滤到最佳调整值不能解决问题。)
trainControl(..., savePredictions = "final")
文档说train
对象是“训练错误率的数据框......”我不确定这意味着什么,但最佳行的值是一致的与results
上计算的指标不同。为什么他们有所不同,我怎样才能让他们排队?
pred
由reprex package(v0.2.0)创建于2018-04-09。
答案 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。