【问题标题】:k-fold cross-validation in dplyr?dplyr中的k折交叉验证?
【发布时间】:2016-11-23 13:37:41
【问题描述】:

Hadley Wickham proposed 可以使用dplyr 包进行引导,他的建议是was improved 然后implemented in broom package。是否也可以实现k-fold交叉验证?

我猜第一步(选择train组)很简单:

crossvalidate <- function (df, k = 5) {
  n <- nrow(df)
  idx <- sample(rep_len(1:k, n))
  attr(df, "indices") <- lapply(1:k, function(i) which(idx != i))
  attr(df, "drop") <- TRUE
  attr(df, "group_sizes") <- nrow(df) - unclass(table(idx))
  attr(df, "biggest_group_size") <- max(attr(df, "group_sizes"))
  attr(df, "labels") <- data.frame(replicate = 1:k)
  attr(df, "vars") <- list(quote(replicate))
  class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame")
  df
}

但不知何故,我在任何地方都找不到attr(, "indices") 的任何文档来了解是否可以使用索引“其他” 选择用于选择测试的索引组索引。你有什么想法?

【问题讨论】:

  • 你应该看看modelr,Hadley 的带有crossv_kfold 函数的包。

标签: r dplyr


【解决方案1】:

https://rpubs.com/dgrtwo/cv-modelr - 这里有一个使用 dplyr 包的 k 折交叉验证示例:

library(ISLR)
library(dplyr)
library(purrr)
library(modelr)
library(broom)
library(tidyr)

set.seed(1)

models <- Smarket %>%
  select(Today, Lag1:Lag5) %>%
  crossv_kfold(k = 20) %>%
  mutate(model = map(train, ~ lm(Today ~ ., data = .)))

predictions <- models %>%
  unnest(map2(model, test, ~ augment(.x, newdata = .y)))

predictions %>%
  summarize(MSE = mean((Today - .fitted) ^ 2),
            MSEIntercept = mean((Today - mean(Today))^2))

【讨论】:

    【解决方案2】:

    这是使用 dplyr 进行分层 5 倍 CV 的一种解决方案:

    df_fold = df %>%
      group_by(group_var) %>%
      sample_frac(1) %>%
      mutate(fold=rep(1:5, length.out=n())) %>%
      ungroup
    
    for(i in 1:5){
      val = df_fold %>% filter(fold==i)
      tr = df_fold %>% anti_join(val, by=ID_var)
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2018-08-29
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2016-11-15
      • 2017-07-02
      • 2020-10-24
      相关资源
      最近更新 更多