随机森林回归模型的ntree和mtry设置值

随机森林回归模型的ntree和mtry设置值,r,statistics,machine-learning,regression,random-forest,R,Statistics,Machine Learning,Regression,Random Forest,我正在使用R软件包randomForest对一些生物数据进行回归。我的培训数据大小为38772 X 201 我只是想知道——对于树的数量ntree和每个级别的变量数量mtry,什么是一个好值?是否有一个近似公式来计算这些参数值 我输入数据中的每一行都是一个200字符的氨基酸序列,我想建立一个回归模型来使用这种序列来预测蛋白质之间的距离 简单的答案是否定的 当然,randomForest函数对ntree和mtry都有默认值。mtry的默认值通常(但并非总是)是合理的,而通常人们会希望将ntree的

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

我只是想知道——对于树的数量
ntree
和每个级别的变量数量
mtry
,什么是一个好值?是否有一个近似公式来计算这些参数值


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

简单的答案是否定的

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

ntree
的“正确”值通常不太重要,因为只要稍加修改,模型的预测在经过一定数量的树后不会有太大变化

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

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


另外,不知何故,我忘记了ranfomForest包本身有一个
tuneRF
函数,该函数专门用于搜索
mtry
的“最佳”值。mtry的默认值非常合理,因此实际上不需要使用它。有一个函数
tuneRF
用于优化此参数。但是,请注意,这可能会导致偏见

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

这里有一个警告:变量交互稳定的速度比错误稳定的速度慢,所以,如果你有大量的自变量,你需要更多的复制。我会保持ntree为奇数,这样就可以打破领带了

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

这张纸有用吗?

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

他们从不使用超过200棵树


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


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

我同意这听起来更像是一份工作,虽然这是一个很好的问题,但它不属于这里。另外,也许可以尝试让它更具可读性。在从大型数据集构建随机林的现实中,ntrees通常是运行时和精度之间的折衷。希望您不介意我稍微整理一下,只是为了让它更具可读性。关于@Jeffrey Evans答案的最后一点,我建议使用
rfcv
(此处也有解释)。我发现它有助于去除最不重要的自变量。我多年来一直在使用随机森林,不知何故,我从未想过使用奇数棵树来打破联系。注意。吹。仅供参考,我与Adele Cutler就射频参数的优化进行了交谈,她指出,“tuneRF”和“训练”的使用会导致偏差。此外,正如我在文章中所指出的,通过过度关联集合,可能会过度拟合RF。因此,误差收敛、变量交互和避免过度拟合之间的引导复制数量是平衡的。这是仅用于分类的经验法则!
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))
  }
}