2016-05-29 24 views
2

喜歡用於隨機森林模型創建的遊俠包的速度,但無法看到如何調整樹的數量或樹數。我意識到我可以通過脫字符的train()語法來做到這一點,但我更喜歡使用純粹遊俠的速度增加。使用R中的純遊俠軟件包進行超參數調整

這是我使用測距儀(偉大的工程)基本模型創建的例子:

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) 

我寧願調整常規(閱讀:non-csrf)射頻算法遊俠提供。有關遊俠中任一路徑的超參數調整解決方案的任何想法?謝謝!

回答

3

我覺得至少有兩個誤區:

一,功能ranger沒有一個叫training_data參數。您的錯誤消息Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : unused argument (training_data = iris)指的是。你可以看到,當你看到?rangerargs(ranger)

二,功能csrf,另一方面,有training_data作爲輸入,但也需要test_data。最重要的是,這兩個參數沒有任何默認值,這意味着你必須提供它們。沒有問題了以下工作:

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作爲訓練和測試數據集。你顯然不想在你的真實應用程序中這樣做。此外,請注意ranger也以num.treesmtry作爲輸入,因此您可以嘗試在此處進行調整。

+0

神奇的信息,謝謝!據你所知,遊俠中沒有非csrf路線來進行超參數調節?另外,Zheyuan最初詢問是否可以使用非csrf選項(而不僅僅是爲了解決csrf文檔的實現問題)。 –

+0

很慷慨,夥計們,謝謝。請注意,coffeinjunky - 即使我發佈的錯誤消息說我使用了遊程功能,但我實際上使用了csrf函數(不確定是否要編輯您的響應)。我會通過電子郵件向Marvin Wright(維護者)發送關於此事的參考信息。再次感謝! –

+0

此外,coffeinjunky,如果你正在編輯,你會介意添加一個param1的例子,param2語法調整與遊俠功能?謝謝! –

4

爲了回答我的(不清楚)問題,顯然遊俠沒有內置的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 

總體而言,插入符是做遊俠網格搜索如果使用非公式接口的最快方式。

0

請注意,默認情況下,mlr會禁用遊俠的內部並行化。設置超參數num.threads可用內核的數量,加快mlr起來:

learner <- makeLearner("classif.ranger", num.threads = 4) 

另外,調用tuneParams並行調諧之前通過

parallelStartMulticore(4) # linux/osx 
parallelStartSocket(4) # windows 

開始並行後端。