随机森林回归模型的ntree和mtry设置值
我正在使用R软件包randomForest对一些生物数据进行回归。我的培训数据大小为随机森林回归模型的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的
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))
}
}