【问题标题】:setting values for ntree and mtry for random forest regression model为随机森林回归模型设置 ntree 和 mtry 的值
【发布时间】:2012-12-07 01:03:46
【问题描述】:

我正在使用 R 包 randomForest 对一些生物数据进行回归。我的训练数据大小是38772 X 201

我只是想知道——对于树的数量ntree 和每个级别的变量数量mtry,什么是一个好的值?有没有近似公式可以求出这样的参数值?

我输入数据中的每一行都是一个代表氨基酸序列的 200 个字符,我想建立一个回归模型来使用这样的序列来预测蛋白质之间的距离。

【问题讨论】:

  • 这听起来更像是stats.stackexchange.com的工作
  • 我同意,虽然是个好问题,但它不属于这里。另外,也许尝试使它更具可读性。
  • 在从大型数据集构建随机森林的现实中,ntrees 通常是运行时和精度之间的折衷。

标签: r statistics machine-learning regression random-forest


【解决方案1】:

我使用的一个很好的技巧是,首先首先取预测变量数量的平方根,然后将该值插入“mtry”。它通常与随机森林中的 Tunerf 函数选择的值大致相同。

【讨论】:

  • 这只是一个分类规则!
【解决方案2】:

我在玩 ntree 和 mtry 时使用下面的代码检查准确性(更改参数):

results_df <- data.frame(matrix(ncol = 8))
colnames(results_df)[1]="No. of trees"
colnames(results_df)[2]="No. of variables"
colnames(results_df)[3]="Dev_AUC"
colnames(results_df)[4]="Dev_Hit_rate"
colnames(results_df)[5]="Dev_Coverage_rate"
colnames(results_df)[6]="Val_AUC"
colnames(results_df)[7]="Val_Hit_rate"
colnames(results_df)[8]="Val_Coverage_rate"


trees = c(50,100,150,250)
variables = c(8,10,15,20)

for(i in 1:length(trees))
{
  ntree = trees[i]
  for(j in 1:length(variables))
  {
    mtry = variables[j]
    rf<-randomForest(x,y,ntree=ntree,mtry=mtry)
    pred<-as.data.frame(predict(rf,type="class"))
    class_rf<-cbind(dev$Target,pred)

    colnames(class_rf)[1]<-"actual_values"
    colnames(class_rf)[2]<-"predicted_values"
    dev_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1))
    dev_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1))

    pred_prob<-as.data.frame(predict(rf,type="prob"))
    prob_rf<-cbind(dev$Target,pred_prob)
    colnames(prob_rf)[1]<-"target"
    colnames(prob_rf)[2]<-"prob_0"
    colnames(prob_rf)[3]<-"prob_1"
    pred<-prediction(prob_rf$prob_1,prob_rf$target)
    auc <- performance(pred,"auc")
    dev_auc<-as.numeric(auc@y.values)

    pred<-as.data.frame(predict(rf,val,type="class"))
    class_rf<-cbind(val$Target,pred)

    colnames(class_rf)[1]<-"actual_values"
    colnames(class_rf)[2]<-"predicted_values"
    val_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1))
    val_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1))

    pred_prob<-as.data.frame(predict(rf,val,type="prob"))
    prob_rf<-cbind(val$Target,pred_prob)
    colnames(prob_rf)[1]<-"target"
    colnames(prob_rf)[2]<-"prob_0"
    colnames(prob_rf)[3]<-"prob_1"
    pred<-prediction(prob_rf$prob_1,prob_rf$target)
    auc <- performance(pred,"auc")
    val_auc<-as.numeric(auc@y.values)
    results_df = rbind(results_df,c(ntree,mtry,dev_auc,dev_hit_rate,dev_coverage_rate,val_auc,val_hit_rate,val_coverage_rate))
  }
}   

【讨论】:

    【解决方案3】:

    这篇论文有帮助吗? Limiting the Number of Trees in Random Forests

    抽象。本文的目的是提出一个简单的程序, 先验确定要按顺序组合的最小分类器数量 获得与使用 更大的乐团的组合。该程序基于 McNemar 非参数显着性检验。先验地知道最小值 给出最佳预测精度的分类器集合的大小,构成 时间和内存成本的收益,特别是对于庞大的数据库 和实时应用。在这里,我们将此过程应用于四个多重 具有 C4.5 决策树的分类器系统(Breiman 的 Bagging,Ho 的 随机子空间,我们标记为“Bagfs”和 Breiman 的组合 随机森林)和五个大型基准数据库。值得注意的是 建议的程序可以很容易地扩展到其他基础 学习算法也比决策树好。实验结果 表明可以显着限制树的数量。我们 还表明,获得所需的最小树数 最佳预测精度可能因一种分类器组合而异 方法到另一个

    他们从不使用超过 200 棵树。

    【讨论】:

      【解决方案4】:

      mtry 的默认值是相当合理的,因此实际上没有必要使用它。有一个函数tuneRF 用于优化这个参数。但是,请注意,这可能会导致偏见。

      引导复制的数量没有优化。我经常从ntree=501 开始,然后绘制随机森林对象。这将显示基于 OOB 错误的错误收敛。您需要足够多的树来稳定错误,但不要太多,以免过度关联整体,这会导致过度拟合。

      需要注意的是:变量交互作用的稳定速度比误差慢,因此,如果您有大量自变量,则需要更多重复。我会将 ntree 保持为奇数,以便可以打破关系。

      对于您的问题,我将从ntree=1501 开始。我还建议查看已发布的变量选择方法之一,以减少自变量的数量。

      【讨论】:

      • 希望你不介意我把它清理了一点,只是为了让它更具可读性。
      • 关于@Jeffrey Evans 回答的最后一点,我建议使用rfcv(也在这里解释stats.stackexchange.com/questions/112556/…)。我发现它有助于删除最不重要的自变量。
      • 我多年来一直在使用随机森林,但不知何故,我从未想过使用奇数个树来打破平局。头脑。吹。
      【解决方案5】:

      简短的回答是否定的。

      randomForest 函数当然有ntreemtry 的默认值。 mtry 的默认值通常(但并非总是)合理,而通常人们会希望将ntree 从默认值 500 增加不少。

      ntree 的“正确”值通常不是什么大问题,因为只要稍加修改,模型的预测在一定数量的树之后不会有太大变化就会很明显。

      您可以花费(阅读:浪费)大量时间来修补 mtry(以及 sampsizemaxnodesnodesize 等),这可能会有一些好处,但根据我的经验不是很多。但是,每个数据集都会有所不同。有时您可能会看到很大的不同,有时根本没有。

      caret 包有一个非常通用的函数train,它允许您对参数值(如mtry)进行简单的网格搜索,用于各种模型。我唯一要注意的是,使用相当大的数据集执行此操作可能会很快消耗时间,因此请注意这一点。

      另外,不知何故,我忘记了 ranfomForest 包本身有一个 tuneRF 函数,专门用于搜索 mtry 的“最佳”值。

      【讨论】:

      • 仅供参考,我已经与 Adele Cutler 讨论了 RF 参数的优化问题,她指出“tuneRF”和“train”使用的逐步程序会导致偏差。此外,正如我的帖子中所指出的,可以通过过度关联整体来过度拟合 RF。因此,在误差收敛、变量交互和避免过拟合之间存在一个平衡。
      猜你喜欢
      • 2021-07-05
      • 2022-11-11
      • 2021-03-23
      • 2020-03-18
      • 2019-12-06
      • 2016-04-24
      • 2018-12-06
      • 2019-08-24
      • 2018-09-21
      相关资源
      最近更新 更多