2017-07-20 9 views
2

J'essaie d'utiliser le paquetage MLR pour régler les hyper-paramètres d'un arbre de décision construit avec le paquet rpart. Même si je peux ajuster les paramètres de base de l'arbre de décision (par exemple minsplit, maxdepth et ainsi de suite), je ne suis pas en mesure de définir correctement les valeurs du paramètre param. Plus précisément, je voudrais essayer différents priors dans la recherche de grille.Réglage des paramètres dans rpart avec le package MLR?

Voici le code que j'écrit (dat est le dataframe J'utilise, et target est ma variable de classe):

# 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)))) 
) 

Lorsque je tente d'exécuter l'accord, avec:

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

Je reçois l'erreur

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

J'ai essayé aussi de définir parms comme UntypedParam avec

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

En effet, en tapant getParamSet("classif.rpart"), il me semble que l'accord accepte une « variable non typée » plutôt que discret.

Cependant, lorsque je tente cela, je reçois l'erreur:

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 

Quelqu'un peut-il aider?

Répondre

2

Vous devez définir le paramètre "parms" comme ceci:

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

a et b peuvent être des noms arbitraires qui ne font que refléter la valeur réelle dit.

+0

Parfait, merci! – aprospero