2016-03-01 86 views
5

我正在創建自定義學習器,特別是我試圖在mlr框架內使用h2o機器學習算法。 h2o.deeplearning函數的'hidden'參數是我想要調整的整數向量。在mlr中調整整數矢量

makeRLearner.classif.h2o_dl = function() { 
makeRLearnerClassif(
cl = "classif.h2o_dl", 
package = "h2o", 
par.set = makeParamSet(
    makeDiscreteLearnerParam(id = "activation", 
    values = c("Rectifier", "Tanh", "TanhWithDropout", "RectifierWithDropout", "Maxout", "MaxoutWithDropout")), 
    makeNumericLearnerParam(id = "epochs", default = 10, lower = 1), 
    makeNumericLearnerParam(id = "rate", default = 0.005, lower = 0, upper = 1), 
    makeIntegerVectorLearnerParam(id = "hidden", default = c(100,100)), 
    makeDiscreteLearnerParam(id = "loss", values = c("Automatic", 
      "CrossEntropy", "Quadratic", "Absolute", "Huber")) 
), 
properties = c("twoclass", "multiclass", "numerics", "factors", "prob","missings"), 
name = "Deep Learning Neural Network with h2o", 
short.name = "h2o_deeplearning_classif", 
note = "tbd" 
) 
} 

trainLearner.classif.h2o_dl = function(.learner, .task,.subset,.weights=NULL, ...) { 
f = getTaskFormula(.task) 
data = getTaskData(.task, .subset) 
data_h2o <- as.h2o(data, 
       destination_frame = paste0(
        "train_", 
        format(Sys.time(), "%m%d%y_%H%M%S"))) 
h2o::h2o.deeplearning(x = getTaskFeatureNames(.task), 
      y = setdiff(names(getTaskData(.task)), 
         getTaskFeatureNames(.task)), 
      training_frame = data_h2o, ...) 
} 

predictLearner.classif.h2o_dl = function(.learner, .model, .newdata, predict.method = "plug-in", ...) { 
data <- as.h2o(.newdata, 
      destination_frame = paste0("pred_", 
             format(Sys.time(), "%m%d%y_%H%M%S"))) 
p = predict(.model$learner.model, newdata = data, method = predict.method, ...) 
if (.learner$predict.type == "response") 
return(as.data.frame(p)[,1]) else return(as.matrix(as.numeric(p))[,-1]) 
} 

我試圖通過makeDiscreteParam功能的手段調諧經由網格搜索參數「隱藏」:我以下面的方式定義的「隱藏」參數

library(mlr) 
library(h2o) 
h2o.init() 

lrn.h2o <- makeLearner("classif.h2o_dl") 
n <- getTaskSize(sonar.task) 
train.set = seq(1, n, by = 2) 
test.set = seq(2, n, by = 2) 
mod.h2o = train(lrn.h2o, sonar.task, subset = train.set) 
pred.h2o <- predict(mod.h2o,task= sonar.task, subset = train.set) 

ctrl = makeTuneControlGrid() 
rdesc = makeResampleDesc("CV", iters = 3L) 
ps = makeParamSet(
makeDiscreteParam("hidden", values = list(c(10,10),c(100,100))), 
makeDiscreteParam("rate", values = c(0.1,0.5)) 
) 

res = tuneParams("classif.h2o_dl", task = sonar.task, resampling = rdesc,par.set = ps,control = ctrl) 

這導致警告消息

Warning messages: 
1: In checkValuesForDiscreteParam(id, values) : 
number of items to replace is not a multiple of replacement length 
2: In checkValuesForDiscreteParam(id, values) : 
number of items to replace is not a multiple of replacement length 

ps看起來是這樣的:

ps 
      Type len Def Constr Req Tunable Trafo 
hidden discrete - - 10,100 - TRUE  - 
rate discrete - - 0.1,0.5 - TRUE  - 

這不會導致將隱藏參數調整爲向量。我也嘗試過其他特殊的構造函數(例如makeNumericVectorParam),它們也不起作用。 有沒有人在調整(整數)載體在mlr的經驗,可以給我一個提示?

+0

這聽起來像你需要在這裏使用'makeNumericVectorParam'。你能分享你嘗試過的代碼嗎? –

+0

我剛剛添加了完整的代碼 –

+0

嗯,如果你想嘗試一下這些特定的值,我會引入一個虛擬參數,它只是一個值列表中的索引,用於在學習器的包裝器中嘗試和檢查/轉換它。 –

回答