11

ランダム フォレスト モデル作成用のレンジャー パッケージの速度は気に入っていますが、mtry やツリーの数を調整する方法がわかりません。キャレットの train() 構文を使用してこれを実行できることはわかっていますが、純粋なレンジャーを使用することによる速度の向上を好みます。

ranger を使用した基本的なモデル作成の例を次に示します (これはうまく機能します)。

library(ranger)
data(iris)

fit.rf = ranger(
  Species ~ .,
  training_data = iris,
  num.trees = 200
)

print(fit.rf)

調整オプションの公式ドキュメントを見ると、csrf() 関数がハイパーパラメーターを調整する機能を提供しているように見えますが、正しい構文を取得できません。

library(ranger)
data(iris)

fit.rf.tune = csrf(
  Species ~ .,
  training_data = iris,
  params1 = list(num.trees = 25, mtry=4),
  params2 = list(num.trees = 50, mtry=4)
)

print(fit.rf.tune)

結果:

Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : 
  unused argument (training_data = iris)

そして、レンジャーが提供する通常の(読み取り:非csrf)rfアルゴリズムで調整したいと思います。レンジャーのいずれかのパスのハイパーパラメータ調整ソリューションに関するアイデアはありますか? ありがとうございました!

4

5 に答える 5

17

私の(不明確な)質問に答えるために、明らかにレンジャーには組み込みのCV / GridSearch機能がありません。ただし、キャレットの外で (グリッド検索を介して) レンジャーでハイパーパラメーター調整を行う方法は次のとおりです。コードを提供してくれた Marvin Wright (レンジャーのメンテナー) に感謝します。フォーミュラインターフェイスを使用していたため、レンジャーを使用したキャレットCVが遅かったことがわかりました(これは避ける必要があります)。

ptm <- proc.time()
library(ranger)
library(mlr)

# Define task and learner
task <- makeClassifTask(id = "iris",
                        data = iris,
                        target = "Species")

learner <- makeLearner("classif.ranger")

# Choose resampling strategy and define grid
rdesc <- makeResampleDesc("CV", iters = 5)
ps <- makeParamSet(makeIntegerParam("mtry", 3, 4),
                   makeDiscreteParam("num.trees", 200))

# Tune
res = tuneParams(learner, task, rdesc, par.set = ps,
           control = makeTuneControlGrid())

# Train on entire dataset (using best hyperparameters)
lrn = setHyperPars(makeLearner("classif.ranger"), par.vals = res$x)
m = train(lrn, iris.task)

print(m)
print(proc.time() - ptm) # ~6 seconds

好奇心のために、キャレットに相当するものは

ptm <- proc.time()
library(caret)
data(iris)

grid <-  expand.grid(mtry = c(3,4))

fitControl <- trainControl(method = "CV",
                           number = 5,
                           verboseIter = TRUE)

fit = train(
  x = iris[ , names(iris) != 'Species'],
  y = iris[ , names(iris) == 'Species'],
  method = 'ranger',
  num.trees = 200,
  tuneGrid = grid,
  trControl = fitControl
)
print(fit)
print(proc.time() - ptm) # ~2.4 seconds

全体として、式以外のインターフェースを使用している場合、レンジャーでグリッド検索を行うにはキャレットが最速の方法です。

于 2016-06-15T21:14:12.303 に答える
6

少なくとも 2 つのエラーがあると思います。

まず、関数にrangerは というパラメーターがありませんtraining_data。あなたのエラーメッセージError in ranger(Species ~ ., training_data = iris, num.trees = 200) : unused argument (training_data = iris)はそれを指しています。?rangerまたはを見るとわかりますargs(ranger)

csrf第二に、一方、関数はtraining_dataを入力として持つだけでなく、 も必要としtest_dataます。最も重要なことは、これら 2 つの引数にはデフォルトがないため、指定する必要があることです。以下は問題なく動作します。

fit.rf = ranger(
  Species ~ ., data = iris,
  num.trees = 200
)

fit.rf.tune = csrf(
Species ~ .,
training_data = iris,
test_data = iris,
params1 = list(num.trees = 25, mtry=4),
params2 = list(num.trees = 50, mtry=4)
)

ここでは、irisトレーニング データセットとテスト データセットの両方を提供しました。実際のアプリケーションでそれを行いたくないことは明らかです。さらに、入力としてandrangerも取ることに注意してください。そのため、そこでチューニングを試すことができます。num.treesmtry

于 2016-05-29T21:05:09.183 に答える