2016-03-01 10 views
5

Ich erstelle benutzerdefinierte Lerner, insbesondere versuche ich die h2o Machine Learning-Algorithmen innerhalb der mlr-Framework zu verwenden. Der 'versteckte' Parameter der h2o.deeplearning-Funktion ist ein ganzzahliger Vektor, den ich einstellen möchte. I definiert die ‚versteckten‘ Parameter in der folgenden Art und Weise:Tuning Integer-Vektor in 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]) 
} 

Ich habe versucht, den Parameter ‚versteckte‘ über Rastersuche Abstimmung mittels der makeDiscreteParam Funktion:

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) 

, die in der Warnmeldung geführt

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 

und ps sieht wie folgt aus:

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

, was nicht dazu führt, dass der versteckte Parameter als Vektor eingestellt wird. Ich versuchte auch andere spezielle Konstruktorfunktion (z. B. makeNumericVectorParam), die auch nicht funktionierte. Hat jemand Erfahrung im Tuning (Integer) Vektoren in mlr und könnte mir einen Tipp geben?

+0

Es klingt wie Sie verwenden müssen 'makeNumericVectorParam' hier. Können Sie den Code teilen, den Sie ausprobiert haben und der nicht funktioniert hat? –

+0

Ich habe gerade den vollständigen Code –

+0

hinzugefügt. Hmm, wenn Sie nur diese spezifischen Werte versuchen möchten, würde ich einen Dummy-Parameter einführen, der einfach ein Index in die Liste der Werte ist, um das im Wrapper für den Lernenden zu testen und zu konvertieren. –

Antwort