41

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

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

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

4

5 回答 5

38

mtry 的默认值是非常合理的,所以没有必要去搞砸它。有一个tuneRF优化这个参数的函数。但是,请注意,这可能会导致偏见。

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

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

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

于 2012-12-19T16:29:04.387 回答
18

最简洁的答案是不。

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

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

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

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

此外,不知何故,我忘记了ranfomForest包本身具有tuneRF专门用于搜索mtry.

于 2012-12-19T16:24:22.617 回答
5

这篇论文有帮助吗? 限制随机森林中的树木数量

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

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

在此处输入图像描述

于 2016-03-01T10:27:04.373 回答
2

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

于 2017-07-07T16:09:19.897 回答
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))
  }
}   
于 2017-04-27T14:48:41.350 回答