簡體   English   中英

為隨機森林回歸模型設置 ntree 和 mtry 的值

[英]setting values for ntree and mtry for random forest regression model

我正在使用 R 包randomForest對一些生物數據進行回歸。 我的訓練數據大小是38772 X 201

我只是想知道 --- 樹的數量ntree和每級mtry的變量數量的ntree值是多少? 是否有近似公式可以找到此類參數值?

我的輸入數據中的每一行都是一個 200 個字符,代表氨基酸序列,我想建立一個回歸模型來使用這樣的序列來預測蛋白質之間的距離。

mtry 的默認設置是非常明智的,因此實際上沒有必要使用它。 有一個函數tuneRF用於優化此參數。 但是,請注意這可能會導致偏差。

沒有對引導復制的數量進行優化。 我經常從ntree=501開始,然后繪制隨機森林對象。 這將顯示基於 OOB 錯誤的錯誤收斂。 您需要足夠多的樹來穩定錯誤,但又不想太多以至於過度關聯集成,從而導致過擬合。

這里有一個警告:變量交互的穩定速度比誤差慢,所以,如果你有大量的自變量,你需要更多的重復。 我會將 ntree 保留為奇數,以便可以打破聯系。

對於你問題的維度,我會開始ntree=1501 我還建議查看已發布的變量選擇方法之一,以減少自變量的數量。

最簡潔的答案是不。

randomForest函數當然有ntreemtry默認值。 mtry的默認值通常(但並非總是)合理,而通常人們會希望將ntree從它的默認值 500 增加很多。

ntree的“正確”值通常不是什么大問題,因為在經過一定數量的樹后,模型的預測不會發生太大變化,這會很明顯。

您可以花費(閱讀:浪費)大量時間來修改諸如mtry (以及sampsizemaxnodesnodesize等)之類的東西,這可能會帶來一些好處,但以我的經驗nodesize並不多。 但是,每個數據集都會有所不同。 有時您可能會看到很大的差異,有時根本沒有。

caret包有一個非常通用的函數train ,它允許您對參數值進行簡單的網格搜索,例如mtry用於各種模型。 我唯一要注意的是,使用相當大的數據集執行此操作可能會相當快地消耗時間,因此請注意這一點。

此外,不知何故我忘記了ranfomForest包本身有一個tuneRF函數,專門用於搜索mtry的“最佳”值。

這篇論文有幫助嗎?限制隨機森林中的樹數量

抽象的。 本文的目的是提出一個簡單的程序,先驗確定要組合的最小分類器數量,以獲得與通過更大集合組合獲得的預測精度水平相似的預測精度水平。 該過程基於 McNemar 非參數顯着性檢驗。 先驗地知道分類器集合的最小尺寸提供最佳預測精度,構成了時間和內存成本的收益,尤其是對於龐大的數據庫和實時應用程序。 在這里,我們將此過程應用於具有 C4.5 決策樹(Breiman 的 Bagging、Ho 的隨機子空間、我們標記為“Bagfs”的組合和 Breiman 的隨機森林)和五個大型基准數據庫的四個多分類器系統。 值得注意的是,所提出的程序可以很容易地擴展到除決策樹之外的其他基礎學習算法。 實驗結果表明,可以顯着限制樹木的數量。 我們還表明,獲得最佳預測精度所需的最小樹數可能因一種分類器組合方法而異

他們從不使用超過 200 棵樹。

在此處輸入圖片說明

我使用的一個很好的技巧是首先首先取預測變量數量的平方根並將該值插入“mtry”。 它通常與隨機森林中的 tunerf 函數選擇的值大致相同。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM