2016-04-22 8 views
4

Ich baue ein CART Modell und ich versuche 2 Parameter von rpart - CP und Maxdepth einzustellen. Während das Caret-Paket zu einem Zeitpunkt für einen Parameter gut funktioniert, wenn beide verwenden es hält einen Fehler zu werfen, und ich bin, um herauszufinden, nicht in der Lage, warumWie werden mehrere Parameter mit dem Caret-Paket abgestimmt?

library(caret) 
data(iris) 
tc <- trainControl("cv",10) 
rpart.grid <- expand.grid(cp=seq(0,0.1,0.01), minsplit=c(10,20)) 
train(Petal.Width ~ Petal.Length + Sepal.Width + Sepal.Length, data=iris, method="rpart", 
     trControl=tc, tuneGrid=rpart.grid) 

ich die folgende Störung erhalte:

Error in train.default(x, y, weights = w, ...) : 
    The tuning parameter grid should have columns cp 

Antwort

4

Methode "rpart" ist nur in der Lage, die cp zu tunen, Methode "rpart2" wird für maxdepth verwendet. Es gibt kein Tuning für minsplit oder eines der anderen rpart-Steuerelemente. Wenn Sie verschiedene Optionen einstellen möchten, können Sie ein benutzerdefiniertes Modell schreiben, um dies zu berücksichtigen.

Klicken Sie auf here, um weitere Informationen dazu zu erhalten. Lesen Sie auch this answer darüber, wie Sie das rpart-Steuerelement innerhalb der Zugfunktion verwenden.

6

caret kann dies nicht mit den integrierten Methoden tun, so dass Sie Ihre eigenen hinzufügen müssen.

Alternativ können Sie dies auf mlr ein ähnliches Machine Learning-Framework ausprobieren, das viele Resampling-Strategien, Tuning-Steuerungsmethoden und Algorithmus-Parameter-Tuning aus der Box erlaubt. Es gibt viele learners already implemented, mit mehreren verschiedenen evaluation metrics to choose from.

In Ihrem speziellen Problem, versuchen Sie folgendes Beispiel:

library(mlr) 
iris.task = classif.task = makeClassifTask(id = "iris-example", data = iris, target = "Species") 
resamp = makeResampleDesc("CV", iters = 10L) 

lrn = makeLearner("classif.rpart") 

control.grid = makeTuneControlGrid() 
#you can pass resolution = N if you want the algorithm to 
#select N tune params given upper and lower bounds to a NumericParam 
#instead of a discrete one 
ps = makeParamSet(
    makeDiscreteParam("cp", values = seq(0,0.1,0.01)), 
    makeDiscreteParam("minsplit", values = c(10,20)) 
) 

#you can also check all the tunable params 
getParamSet(lrn) 

#and the actual tuning, with accuracy as evaluation metric 
res = tuneParams(lrn, task = iris.task, resampling = resamp, control = control.grid, par.set = ps, measures = list(acc,timetrain)) 
opt.grid = as.data.frame(res$opt.path) 
print(opt.grid) 

mlr ist unglaublich vielseitig: Wrapper-Ansatz ein Lernende mit Tuning-Strategien, Vorverarbeitung, Filterung und Anrechnungs Schritte und vieles mehr verschmelzen lässt.

+1

Ich bin in meinen ersten Schritten mit 'mlr', vielleicht sollte der Lerner' lrn' in der 'tuneParams' Funktion verwendet werden. –

+1

@ EnriquePérezHerrero Sie sind absolut richtig, danke für die Köpfe hoch! –

Verwandte Themen