RパッケージrandomForest
を使用して、いくつかの生物学的データの回帰を行っています。トレーニングデータのサイズは38772 X 201
。
私はちょうど疑問に思いました---木の数ntree
とレベルごとの変数の数mtry
に良い値は何でしょうか?そのようなパラメータ値を見つけるための近似式はありますか?
入力データの各行はアミノ酸配列を表す200文字であり、タンパク質間の距離を予測するためにそのような配列を使用する回帰モデルを構築したいと思います。
Mtryのデフォルトは非常に賢明なため、実際にいじる必要はありません。このパラメーターを最適化する関数tuneRF
があります。ただし、バイアスを引き起こす可能性があることに注意してください。
bootstrap=複製の数に最適化はありません。私はよくntree=501
次に、ランダムフォレストオブジェクトをプロットします。これにより、OOBエラーに基づいたエラー収束が表示されます。エラーを安定させるのに十分な数のツリーが必要ですが、アンサンブルを過度に相関させるほど多すぎないため、過剰適合になります。
警告は次のとおりです。変数の相互作用はエラーよりも遅い速度で安定するため、多数の独立変数がある場合は、より多くの複製が必要です。 ntreeの数を奇数にしておくと、関係が壊れる可能性があります。
あなたの寸法の問題については、ntree=1501
。また、公開されている変数選択アプローチの1つを調べて、独立変数の数を減らすことをお勧めします。
短い答えはノーです。
もちろん、randomForest
関数には、ntree
とmtry
の両方のデフォルト値があります。 mtry
のデフォルトは、多くの場合(常にではありませんが)賢明ですが、一般的に、人々はntree
をデフォルトの500からかなり増やしたいと思うでしょう。
ntree
の「正しい」値は、モデルからの予測が特定の数のツリーの後にあまり変化しないことを少しいじると明らかになるので、通常はそれほど重要ではありません。
おそらくmtry
(およびsampsize
およびmaxnodes
およびnodesize
など)をいじることに多くの時間を費やすことができます(無駄:おそらく)いくつかの利点がありますが、私の経験ではあまりありません。ただし、すべてのデータセットは異なります。大きな違いが見られることもあれば、まったく見られないこともあります。
caretパッケージには、非常に一般的な関数train
があり、さまざまなモデルのmtry
などのパラメーター値に対して単純なグリッド検索を実行できます。私の唯一の注意は、かなり大きなデータセットでこれを行うと、かなり早く時間がかかる可能性があるため、注意してください。
また、どういうわけかranfomForestパッケージ自体にtuneRF
の「最適な」値を検索するためのmtry
関数があることを忘れていました。
この論文は役立ちますか? ランダムフォレストのツリー数の制限
抽象。この論文の目的は、より大きなアンサンブルの組み合わせで得られるものと同様の予測精度レベルを得るために、アプリオリが結合する分類器の最小数を決定する簡単な手順を提案することです。手順は、有意性のノンパラメトリック検定McNemarに基づいています。最適な予測精度を提供する分類器アンサンブルの最小サイズをアプリオリに知ることは、特に巨大なデータベースとリアルタイムアプリケーションにとって時間とメモリコストの増加になります。ここでは、この手順を、C4.5決定木(ブライマンのバギング、ホーのランダム部分空間、「Bagfs」とラベル付けしたそれらの組み合わせ、およびブライマンのランダムフォレスト)と5つの大きなベンチマークデータベースを持つ4つの複数の分類システムに適用しました。提案された手順は、決定木以外の他の基本学習アルゴリズムにも容易に拡張できることに注意してください。実験結果は、木の数を大幅に制限することが可能であることを示しました。また、最良の予測精度を得るために必要なツリーの最小数は、分類器の組み合わせ方法ごとに異なる場合があることも示しました。
彼らは決して200本以上の木を使用しません。
私が使用する素敵なトリックの1つは、最初に予測子の数の平方根を最初に取得し、その値を「mtry」にプラグインすることです。通常、ランダムフォレストのチューナー機能が選択する値とほぼ同じです。
以下のコードを使用して、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))
}
}