如何在使用train()和r中的交叉验证时绘制RMSE与装袋尝试的树数

Posted

技术标签:

【中文标题】如何在使用train()和r中的交叉验证时绘制RMSE与装袋尝试的树数【英文标题】:how to plot RMSE vs number of trees tries in bagging when using train() and cross validation in r 【发布时间】:2022-01-11 02:13:53 【问题描述】:

我正在研究这个关于装袋方法的网站。 https://bradleyboehmke.github.io/HOML/bagging.html

我将使用带有交叉验证的 train() 函数进行装袋。像下面的东西。 据我所知,nbagg=200 告诉 r 尝试 200 棵树,计算每棵树的 RMSE 并返回实现最佳 RMSE 的树的数量(这里是 80 )。 现在我怎样才能看到这个模型中产生的 RMSE 其他 nbagg 值。就像该网站中的 RMSE 与树数的关系图(开始介绍 cv 方法和 train() 函数,如下图所示)

ames_bag2 <- train(
  Sale_Price ~ .,
  data = ames_train,
  method = "treebag",
  trControl = trainControl(method = "cv", number = 10),
  nbagg = 200,  
  control = rpart.control(minsplit = 2, cp = 0)
)
ames_bag2
## Bagged CART 
## 
## 2054 samples
##   80 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1849, 1848, 1848, 1849, 1849, 1847, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   26957.06  0.8900689  16713.14

【问题讨论】:

我的回答解决了你的目的吗? 【参考方案1】:

由于您分享的示例无法完全重现,因此我从mtcars 数据集中举了一个不同的示例来说明如何做到这一点。您可以为您的数据扩展它。

注意:此处显示的 RMSE 是 10 个 RMSE 的平均值,因为此处的 CV 数为 10。所以我们将只存储它。在此处的示例中也添加相关库。并将树的最大数量设置为 15,仅作为示例。

library(ipred)
library(caret)
library(rpart)
library(dplyr)
data("mtcars")

n_trees <-1

error_df <- data.frame()

while (n_trees <= 15) 
  
  ames_bag2 <- train(
    mpg ~.,
    data = mtcars,
    method = "treebag",
    trControl = trainControl(method = "cv", number = 10),
    nbagg = n_trees,  
    control = rpart.control(minsplit = 2, cp = 0)
  )
  
  error_df %>%
    bind_rows(data.frame(trees=n_trees, rmse=mean(ames_bag2[["resample"]]$RMSE)))-> error_df
    
  n_trees <- n_trees+1
  

error_df 将显示输出。

> error_df
   trees     rmse
1      1 2.493117
2      2 3.052958
3      3 2.052801
4      4 2.239841
5      5 2.500279
6      6 2.700347
7      7 2.642525
8      8 2.497162
9      9 2.263527
10    10 2.379366
11    11 2.447560
12    12 2.314433
13    13 2.423648
14    14 2.192112
15    15 2.256778

【讨论】:

以上是关于如何在使用train()和r中的交叉验证时绘制RMSE与装袋尝试的树数的主要内容,如果未能解决你的问题,请参考以下文章

R:glmnet 的 caret::train 函数可以在固定的 alpha 和 lambda 交叉验证 AUC 吗?

绘制 K 折交叉验证的 ROC 曲线

交叉验证和分数

split_test_train 和交叉验证之间的分数差异很大 (10%)

如何修复重塑我的数据集以进行交叉验证?

交叉验证(Cross Validation)比较