【问题标题】:Caret Repeated CV Kappa Doesn't Match Home Coded Foreach Repeated CV Kappa插入符号重复 CV Kappa 与家庭编码的 Foreach 重复 CV Kappa 不匹配
【发布时间】:2016-06-22 01:32:04
【问题描述】:

在我的大部分建模工作中,我一直在使用 10X10 折交叉验证,并希望通过插入符号为我做这件事来简化我的生活。

但是,当我尝试在插入符号中重复运行 cv 时,结果似乎......很奇怪。

最值得注意的是,Kappa 值与我预期的相差甚远。

  • 插入符号重复cv kappa = 0.0308791
  • 家庭组装重复 cv kappa = 0.4137178

(公平地说,家庭版也使用了 caret 的一些函数调用......但是交叉验证是明确完成的,而不是嵌入到 caret 训练调用中)

这是一个很大的不同。

关于这里发生了什么的任何想法?

数据集位于here

# --- Begin caret cv test ---

library(caret)

dataset <- read.csv("Sample Data.csv")

my_control <- trainControl(
  method="repeatedcv",
  number=10,
  repeats = 10,
  savePredictions="final",
  classProbs=TRUE
)

dataset$Temp <- "Yes"
dataset$Temp[which(dataset$Dep.Var=="0")] <- "No"
dataset$Temp <- as.factor(dataset$Temp)

my.formula <- as.formula("Temp ~ Param.F + Param.C")

testmodel <- train(my.formula, data = dataset,
               method = "glm",
               trControl = my_control,
               metric = "Kappa")

# --- End of caret cv test ---
# --- will reference the model "testmodel" later to show comparison
# --- with home built version

# --- Now for the home built version: ---

library(foreach)

out <- foreach(i = 1:10, .combine = rbind, .inorder = FALSE) %do% {
  folds <- caret::createFolds(dataset$Temp, k = 10, list = FALSE)

  part.out <- foreach(j = 1:10, .combine = rbind, .inorder = FALSE) %do% {
    deve <- dataset[folds != j, ]
    test <- dataset[folds == j, ]

    temp_model <- glm(my.formula, data=deve, family=binomial(link='logit'))
    pred <- predict(temp_model,newdata=test,type="response")
    data.frame(y = test$Dep.Var, prob = pred)
  }
  part.out
}

c.kappa <- foreach (i = 1:1000, .combine = rbind) %do% {
  pred2 <- as.factor((out$prob>(quantile(out$prob, i/1000)))*1)
  c(quantile(out$prob, i/1000), confusionMatrix(pred2, out$y)$overall[2])
}

pred2 <- as.factor((out$prob>c.kappa[which.max(c.kappa[,2]),1])*1)

# --- End of home built version ---

# --- Now to see the results of each: ---

# --- Home Built ---
caret::confusionMatrix(pred2, out$y)$overall[2]

# --- Caret Repeated CV ---
testmodel$results[3]

【问题讨论】:

  • 代码中的注释会很有帮助。我没有看到您的“自制重复 CV kappa”功能,但也许我只是想念它……首先想到的是种子/随机抽样的差异。
  • @Alex - 添加了一些 cmets。即使您多次运行代码,差异也是可重复的,这表明种子和随机抽样不应发挥作用。此外……这就是运行 10X10 倍的全部意义,不是吗……运行足够多的变化,任何奇怪的拆分都不会过多地扭曲结果。

标签: r r-caret cross-validation


【解决方案1】:

您没有在任何地方设置种子,因此无法确认任何重采样结果。

如果您在运行 train 之前设置种子,则可以通过使用 control 对象来使用相同的重采样索引

suffix <- paste0("Rep", gsub(" ", "0", format(1:10)), "$")
out <- foreach(i = 1:10, .combine = rbind, .inorder = FALSE) %do% {
    in_model <- testmodel$control$index[grepl(suffix[i], names(testmodel$control$index))]

然后使用in_model[[j]] 获取用于建模的数据,-in_model[[j]] 为您提供负整数以导出相同的保留集。

另外,您似乎错误地分配了预测。您可能想使用类似

pred <- predict(temp_model,newdata=test,type="response")
pred <- factor(ifelse(pred > .5, "Yes", "No"))

最大

【讨论】:

  • 感谢您的回复!随着重采样迭代的次数,我认为种子真的不重要。使用不同的种子,这些值在多次运行中是完全可重复的。
  • 至于预测的分配,我选择基于最佳 Cohen's Kappa 的预测阈值,结果通常不是 0.5
猜你喜欢
  • 2020-06-07
  • 2018-01-02
  • 2019-12-10
  • 2020-12-11
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多