如何使用Caret包调整多个参数?

时间:2016-04-22 20:32:14

标签: r performance r-caret

我正在构建一个CART模型,我正在尝试调整rpart的两个参数--CP和Maxdepth。虽然Caret包一次适用于一个参数,但当两者都使用时它会不断抛出错误而我无法弄清楚为什么

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)

我收到以下错误:

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

2 个答案:

答案 0 :(得分:6)

caret无法使用集成方法执行此操作,因此您必须添加自己的方法。

或者,您可以在mlr类似的机器学习框架上尝试此操作,该框架允许许多重新采样策略,调整控制方法和开箱即用的算法参数调整。有许多learners already implemented,有几个不同的evaluation metrics to choose from

在您的具体问题中,请尝试以下示例:

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具有令人难以置信的多功能性:包装方法允许学习者融合调整策略,预处理,过滤和插补步骤等等。

答案 1 :(得分:4)

方法&#34; rpart&#34;只能调整cp,方法&#34; rpart2&#34;用于maxdepth。 minsplit或任何其他rpart控件都没有调整。如果要调整不同的选项,可以编写自定义模型以将其考虑在内。

点击here了解有关如何执行此操作的详细信息。另请阅读this answer有关如何在列车功能中使用rpart控件的信息。