2016-11-23 111 views
4

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

我想,第一步(选择列车组)是非常简单的:

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")任何文档,了解它是否以某种方式可以使用索引“其他”选择测试组指数。你有什么想法?

+4

你应该看看['modelr'](https://github.com/hadley/ modelr),Hadley的包含'crossv_kfold'功能的软件包。 – Axeman

回答

1

https://rpubs.com/dgrtwo/cv-modelr - 有你有k折交叉验证的使用dplyr包的例子:

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

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))