使用 caret 包进行交叉验证的最终模型

Posted

技术标签:

【中文标题】使用 caret 包进行交叉验证的最终模型【英文标题】:final model in cross-validation using caret package 【发布时间】:2018-07-15 16:56:22 【问题描述】:

我在 Caret 包中使用随机森林方法对我的数据进行了交叉验证,R 表示最终模型是使用 mtry=34 构建的,这是否意味着在最终的随机森林中(由交叉验证产生)只有 34 个变量我的数据集中的参数中的哪些用于在树中进行拆分?

> output
Random Forest 

 375 samples
  592 predictors
  2 classes: 'alzheimer', 'control' 

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

  mtry  Accuracy   Kappa    
  2   0.6826667  0.3565541
  34   0.7600000  0.5194246
  591   0.7173333  0.4343563

   Accuracy was used to select the optimal model using  the largest value.
   The final value used for the model was mtry = 34.

【问题讨论】:

【参考方案1】:

由于您已经使用 caret 包构建了随机森林,因此建议使用 $finalModel 获取最终模型的摘要,该模型是使用预定义参数选择的模型 (默认值:OOB 精度)。

现在回答你的问题:

从下图中,您可以看到随机森林在每次拆分时从 34 个(我的示例是 31 个,但您明白了)变量中随机选择。根据您的问题,这 与仅使用 34 个变量来种植每棵树相混淆。事实上,所有变量都用在足够大的随机森林中;只有在每个节点上,从 34 个变量池中挑选一个变量以减少模型的方差。这使得每棵树彼此之间更加独立,因此,对大量树进行平均所获得的收益更加显着。

每棵树的树生长过程如下(粗体表示强调,假设您使用来自caret或直接来自randomForestrandomForest实现):

对于具有 N x M 维度(N 表示观察,M 表示变量数量)的数据集,N 的样本(约三分之二)从原始数据中替换并使用这个新样本作为训练集,剩下的观察out(~三分之一)用作测试集 一个数字m(小于M)被指定这样在每个节点分裂时,从M中随机选择m变量和m中的最佳候选变量(以信息增益衡量)用于分割节点m 是森林生长过程中的常数 每棵树都尽可能地生长,无需预先或后修剪

抱歉,迟到了 2 个月的答案,但我认为这是一个很好的问题,如果没有更详细地解释 mtry 参数的真正作用,我会感到遗憾。它经常被误解,所以我想我会在这里添加一个答案!

【讨论】:

【参考方案2】:

randomForest 的文档:

mtry: 随机抽样作为候选变量的数量 分裂。

在这种情况下,最终模型会考虑树中每个拆分的 34 个随机变量。

【讨论】:

以上是关于使用 caret 包进行交叉验证的最终模型的主要内容,如果未能解决你的问题,请参考以下文章

在插入符号交叉验证期间计算模型校准?

R语言里怎么做十折交叉验证

R语言使用caret包中的createFolds函数对机器学习数据集进行交叉验证抽样返回的样本列表长度为k个

R语言做决策树交叉验证时,注册并加载完caret安装包,调用trainControl函数失败怎么办

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

Caret 交叉验证中每个折叠的测试集和训练集