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

我使用R软件包randomForest对一些生物学数据做回归,我的训练数据大小是38772 X 201。

是否有一个近似公式来寻找参数?

时间:

对mtry的默认值非常有意义,因这里不需要使用它。 有一个函数 tuneRF 用于优化这个参数。 但是,请注意,它可能导致偏差。

对于 Bootstrap 复制的数量没有优化。 我经常从 ntree=501 开始,然后对随机林对象进行 plot 。 这将显示基于OOB误差的误差收敛。 你需要足够的树来稳定错误,但是你对集合的关联不太多,这将导致 overfit 。

这里提醒:变量的交互速度比错误慢,如果你需要更多的独立变量,则需要更多。 我将ntree保留为奇数,这样连接就可以被中断。

对于你问题的维度我将开始 ntree=1501 。 我还建议在发布的变量选择方法中寻找减少独立变量的数量。

简单的回答是,不能。

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

这篇论文有用, Limiting the Number of Trees in Random Forests?

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


 }


} 



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

...