2017-07-20 2 views
2

Ich versuche, das MLR-Paket zu verwenden, um die Hyperparameter eines Entscheidungsbaums abzustimmen, der mit dem Rpart-Paket erstellt wurde. Selbst wenn ich die grundlegenden Parameter des Entscheidungsbaums abstimmen kann (z. B. minsplit, maxdepth usw.), kann ich die Werte des Parameters param nicht richtig einstellen. Speziell möchte ich bei der Rastersuche priors anders ausprobieren.Tuning Pars in Rpart mit MLR-Paket?

Hier ist der Code, den ich geschrieben (dat ist der Datenrahmen Ich verwende und target ist meine Klassenvariable):

# Create a task 
dat.task = makeClassifTask(id = "tree", data = dat, target = "target") 
# Define the model 
resamp = makeResampleDesc("CV", iters = 4L) 
# Create the learner 
lrn = makeLearner("classif.rpart") 
# Create the grid params 
control.grid = makeTuneControlGrid() 
ps = makeParamSet(
    makeDiscreteParam("cp", values = seq(0.001, 0.006, 0.002)), 
    makeDiscreteParam("minsplit", values = c(1, 5, 10, 50)), 
    makeDiscreteParam("maxdepth", values = c(20, 30, 50)), 
    makeDiscreteParam("parms", values = list(prior=list(c(.6, .4), 
                 c(.5, .5)))) 
) 

Wenn ich versuche, die Abstimmung auszuführen, mit:

# Actual tuning, with accuracy as evaluation metric 
tuned = tuneParams(lrn, task = dat.task, 
        resampling = resamp, 
        control = control.grid, 
        par.set = ps, measures = acc) 

Ich erhalte den Fehler

Error in get(paste("rpart", method, sep = "."), envir = environment())(Y, : The parms list must have names

Ich habe auch versucht parms als UntypedParam mit

makeUntypedParam("parms", special.vals = list(prior=list(c(.6, .4), c(.5,.5)))) 

Dies, weil durch die Eingabe getParamSet("classif.rpart") war zu definieren, so scheint es mir, dass die Abstimmung eine „nicht typisierte Variablen“, anstatt eine diskrete man akzeptiert.

Allerdings, wenn ich das versuche, erhalte ich die Fehlermeldung:

Error in makeOptPath(par.set, y.names, minimize, add.transformed.x, include.error.message, : 
    OptPath can currently only be used for: numeric,integer,numericvector,integervector,logical,logicalvector,discrete,discretevector,character,charactervector 

Kann jemand helfen?

Antwort

2

Sie haben die Parameter "parms" wie folgt zu definieren:

makeDiscreteParam("parms", values = list(a = list(prior = c(.6, .4)), b = list(prior = c(.5, .5)))) 

a und b können beliebige Namen, die nur das widerspiegeln, was der tatsächliche Wert sagt.

+0

Perfekt, danke! – aprospero