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

时间:2012-12-19 16:09:27

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

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

我只是想知道---树木ntree的数量和每个级别mtry的变量数量有什么好处?是否有一个近似的公式来找到这样的参数值?

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

5 个答案:

答案 0 :(得分:35)

mtry的默认设置非常合理,所以不需要使用它。有一个函数tuneRF用于优化此参数。但是,请注意它可能会导致偏见。

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

以下是警告:变量交互稳定的速度比错误慢,因此,如果您有大量的自变量,则需要更多的重复。我会保持ntree一个奇数,所以可以打破关系。

对于你问题的维度,我会开始ntree=1501。我还建议查看一个已发布的变量选择方法,以减少自变量的数量。

答案 1 :(得分:18)

简短的回答是否定的。

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

ntree的“正确”值通常不是一个值得关注的问题,因为通过一点点的修补很明显,模型的预测在一定数量的树之后不会发生太大变化

您可以花费(阅读:浪费)大量时间来修补mtry(以及sampsizemaxnodes以及nodesize等),可能对某些人来说受益,但在我的经验不是很多。但是,每个数据集都不同。有时您可能会看到很大的差异,有时甚至根本没有。

插入符号包有一个非常通用的函数train,允许您对各种模型的mtry等参数值进行简单的网格搜索。我唯一需要注意的是,使用相当大的数据集进行此操作可能会相当快地耗费时间,因此请注意这一点。

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

答案 2 :(得分:5)

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

  

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

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

enter image description here

答案 3 :(得分:1)

我在使用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))
  }
}   

答案 4 :(得分:1)

我使用的一个很好的技巧是首先从首先获取预测变量数的平方根并将该值插入“mtry”开始。它通常与随机森林中的tunerf功能选择的值相同。