Caret获得火车& cv预测从模型到情节

时间:2018-02-12 20:20:43

标签: r r-caret

我训练了一个简单的模型:

mySim <- train(Event ~ .,
               method = 'rf',
               data = train,
               tuneGrid = tg)

优化隐藏图层的两个nnet参数weight_decaysize。我是第一个尝试caret的人,所以我通常会为每个模型构建绘制train errorcv error。为此,我需要具有trainvalidation传递的预测值。

这是我第一次使用交叉验证,所以我有点不确定如何在每次tuneGrid次迭代中从火车和保持集中获取预测。

如果我有一个长度为3的网格搜索(3个模型要建立)和5倍交叉验证,我假设我将有15套火车&amp;每个模型的坚持预测。

我基本上想要建立的情节是:

enter image description here

在我的y轴是性能指标的情况下,为了使用nnet进行分类,可以说熵丢失,x轴上的size网格搜索值从0增加到最大值< / p>

有没有一种方法可以在trainControl交叉验证期间从训练/保持集中提取预测值?

我查看了一些属性train返回但不确定我是否遗漏了某些内容。

我知道我在这个问题上缺乏代码,但希望我已经解释过了。

更新 我正确地假设在trainControl中设置以下参数将返回允许我创建此图的预测:

  • returnResamp
  • savePredictions

1 个答案:

答案 0 :(得分:3)

以下是如何使用 mlr 库执行请求操作的示例:

library(mlr)
library(mlbench) #for the data set

我将使用Sonar数据集:

data(Sonar)

创建任务:

task <- makeClassifTask(data = Sonar, target = "Class")

创建一个学习者:

lrn <- makeLearner("classif.nnet", predict.type = "prob")

获取学习者的所有可调参数:

getParamSet("classif.nnet")

设置您要调整的内容和范围:

ps <- makeParamSet(
  makeIntegerParam("size", lower = 3, upper = 5),
  makeNumericParam("decay", lower = 0.1, upper = 0.2))

定义重新取样:

cross_val <- makeResampleDesc("RepCV",  
                              reps = 2, folds = 5, stratify  = TRUE, predict = "both")

如何执行搜索(在这种情况下为网格):

ctrl <- mlr::makeTuneControlGrid(resolution = 4L)

把所有东西放在一起:

res.mbo <- tuneParams(lrn, task, cross_val, par.set = ps, control = ctrl, 
                      show.info = FALSE, measures = list(auc, setAggregation(auc, test.sd),  setAggregation(auc, train.mean), setAggregation(auc, train.sd)))

你可以在一个列表中定义很多度量(第一个用于选择超参数,而其他只用于显示)。

提取结果:

res <- mlr::generateHyperParsEffectData(res.mbo)$data

情节:

library(tidyverse)

res %>%
  gather(key, value, c(3,5)) %>%
  mutate(key = as.factor(key)) %>%
ggplot()+
  geom_point(aes(x = size, y = value, color = key))+
  geom_smooth(aes(x = size, y = value, color = key))+
  facet_wrap(~decay)

关于geom_smooth的一系列警告,因为每个拟合只有3个点

enter image description here

以及如何在插入符中执行此操作的示例:

library(caret)

创建一个调控器

ctrl <- trainControl(
  method = "repeatedcv",
  number = 5,
  repeats = 2, 
  classProbs = TRUE,
  savePredictions = "all",
  returnResamp = "all",
  summaryFunction = twoClassSummary
)

创建超级参数网格:

grid <- expand.grid(size = c(4, 5, 6), decay = seq(from = 0.1, to =  0.2, length.out = 4))

调:

fit <- caret::train(Sonar[,1:60], Sonar$Class, 
                 method = 'nnet',
                 tuneGrid = grid, 
                 metric = 'ROC', 
                 trControl = ctrl) 

情节:

fit$results %>%
  ggplot()+
  geom_point(aes(x = size, y = ROC))+
  geom_smooth(aes(x = size, y = ROC))+
  facet_wrap(~decay)

enter image description here