web-dev-qa-db-ja.com

ランダムフォレスト回帰モデルのntreeおよびmtryの値の設定

RパッケージrandomForestを使用して、いくつかの生物学的データの回帰を行っています。トレーニングデータのサイズは38772 X 201

私はちょうど疑問に思いました---木の数ntreeとレベルごとの変数の数mtryに良い値は何でしょうか?そのようなパラメータ値を見つけるための近似式はありますか?

入力データの各行はアミノ酸配列を表す200文字であり、タンパク質間の距離を予測するためにそのような配列を使用する回帰モデルを構築したいと思います。

38
DOSMarter

Mtryのデフォルトは非常に賢明なため、実際にいじる必要はありません。このパラメーターを最適化する関数tuneRFがあります。ただし、バイアスを引き起こす可能性があることに注意してください。

bootstrap=複製の数に最適化はありません。私はよくntree=501次に、ランダムフォレストオブジェクトをプロットします。これにより、OOBエラーに基づいたエラー収束が表示されます。エラーを安定させるのに十分な数のツリーが必要ですが、アンサンブルを過度に相関させるほど多すぎないため、過剰適合になります。

警告は次のとおりです。変数の相互作用はエラーよりも遅い速度で安定するため、多数の独立変数がある場合は、より多くの複製が必要です。 ntreeの数を奇数にしておくと、関係が壊れる可能性があります。

あなたの寸法の問題については、ntree=1501。また、公開されている変数選択アプローチの1つを調べて、独立変数の数を減らすことをお勧めします。

36
Jeffrey Evans

短い答えはノーです。

もちろん、randomForest関数には、ntreemtryの両方のデフォルト値があります。 mtryのデフォルトは、多くの場合(常にではありませんが)賢明ですが、一般的に、人々はntreeをデフォルトの500からかなり増やしたいと思うでしょう。

ntreeの「正しい」値は、モデルからの予測が特定の数のツリーの後にあまり変化しないことを少しいじると明らかになるので、通常はそれほど重要ではありません。

おそらくmtry(およびsampsizeおよびmaxnodesおよびnodesizeなど)をいじることに多くの時間を費やすことができます(無駄:おそらく)いくつかの利点がありますが、私の経験ではあまりありません。ただし、すべてのデータセットは異なります。大きな違いが見られることもあれば、まったく見られないこともあります。

caretパッケージには、非常に一般的な関数trainがあり、さまざまなモデルのmtryなどのパラメーター値に対して単純なグリッド検索を実行できます。私の唯一の注意は、かなり大きなデータセットでこれを行うと、かなり早く時間がかかる可能性があるため、注意してください。

また、どういうわけかranfomForestパッケージ自体にtuneRFの「最適な」値を検索するためのmtry関数があることを忘れていました。

18
joran

この論文は役立ちますか? ランダムフォレストのツリー数の制限

抽象。この論文の目的は、より大きなアンサンブルの組み合わせで得られるものと同様の予測精度レベルを得るために、アプリオリが結合する分類器の最小数を決定する簡単な手順を提案することです。手順は、有意性のノンパラメトリック検定McNemarに基づいています。最適な予測精度を提供する分類器アンサンブルの最小サイズをアプリオリに知ることは、特に巨大なデータベースとリアルタイムアプリケーションにとって時間とメモリコストの増加になります。ここでは、この手順を、C4.5決定木(ブライマンのバギング、ホーのランダム部分空間、「Bagfs」とラベル付けしたそれらの組み合わせ、およびブライマンのランダムフォレスト)と5つの大きなベンチマークデータベースを持つ4つの複数の分類システムに適用しました。提案された手順は、決定木以外の他の基本学習アルゴリズムにも容易に拡張できることに注意してください。実験結果は、木の数を大幅に制限することが可能であることを示しました。また、最良の予測精度を得るために必要なツリーの最小数は、分類器の組み合わせ方法ごとに異なる場合があることも示しました。

彼らは決して200本以上の木を使用しません。

enter image description here

5
bastaPasta

私が使用する素敵なトリックの1つは、最初に予測子の数の平方根を最初に取得し、その値を「mtry」にプラグインすることです。通常、ランダムフォレストのチューナー機能が選択する値とほぼ同じです。

1
KHAN irfan

以下のコードを使用して、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([email protected])

    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([email protected])
    results_df = rbind(results_df,c(ntree,mtry,dev_auc,dev_hit_rate,dev_coverage_rate,val_auc,val_hit_rate,val_coverage_rate))
  }
}   
1
Hillary Murefu