Tidymodels:从训练和测试数据创建一个 rsplit 对象

Tidymodels: Creating an rsplit object from training and testing data

我正在尝试从 Scikit-Learn 跳转到 Tidymodels,并且由于 Julia Silge 和 Andrew Couch 的教程,大多数时候它相对没有痛苦。但是,现在我被困住了。通常我会使用 initial_split(df, strata = x) 来获取要使用的拆分对象。但这次我得到了来自不同部门的测试和训练集,我担心这可能会成为常态。如果没有拆分对象,last_fit() 和 collect_predictions() 等函数将不起作用。

如何对提供的数据集进行逆向工程,使它们成为 rsplit 对象?或者,是否可以先将数据集绑定在一起,然后准确地告诉 initial_split() 哪些行应该去训练和测试?

我看到有人在 https://community.rstudio.com/t/tidymodels-creating-a-split-object-from-testing-and-training-data-perform-last-fit/69885 上问过同样的问题。 Max Kuhn 说你可以对 rsplit 对象进行逆向工程,但我不明白怎么做。 谢谢!

# Example data
train <- tibble(predictor = c(0, 1, 1, 1, 0, 1, 0, 0),
       feature_1 = c(12, 18, 15, 5, 20, 2, 6, 10),
       feature_2 = c(120, 98, 111, 67, 335, 123, 22, 69))

test <- tibble(predictor = c(0, 1, 0, 1),
       feature_1 = c(5, 13, 8, 9),
       feature_2 = c(132, 105, 99, 112))

我可以考虑使用 initial_time_split(),因为它采用第一个 prop 样本进行训练,而不是随机选择。

library(tidymodels)
#> -- Attaching packages ---------- tidymodels 0.1.1 --

train <- tibble(predictor = c(0, 1, 1, 1, 0, 1, 0, 0),
                feature_1 = c(12, 18, 15, 5, 20, 2, 6, 10),
                feature_2 = c(120, 98, 111, 67, 335, 123, 22, 69))

test <- tibble(predictor = c(0, 1, 0, 1),
               feature_1 = c(5, 13, 8, 9),
               feature_2 = c(132, 105, 99, 112))

data <- bind_rows(train, test)

prop = nrow(train) / (nrow(train) + nrow(test))

split <- initial_time_split(data, prop = prop)

train_split <- training(split)
test_split <- testing(split)

all_equal(train, train_split)
#> [1] TRUE
all_equal(test, test_split)
#> [1] TRUE

reprex package (v0.3.0)

于 2020-09-22 创建

逆向工程

如果您检查 rsplit 对象的结构,您会看到它有 $in_id 列出了训练样本的行 ID。您可以手动更改此设置以包括预定义的火车行号。

library(tidymodels)
#> -- Attaching packages -- tidymodels 0.1.1 --

train <- tibble(predictor = c(0, 1, 1, 1, 0, 1, 0, 0),
                feature_1 = c(12, 18, 15, 5, 20, 2, 6, 10),
                feature_2 = c(120, 98, 111, 67, 335, 123, 22, 69))

test <- tibble(predictor = c(0, 1, 0, 1),
               feature_1 = c(5, 13, 8, 9),
               feature_2 = c(132, 105, 99, 112))

data <- bind_rows(train, test, .id = "dataset") %>% 
  mutate(dataset = factor(dataset, labels = c("train", "test")))

train_ids <- which(data$dataset == "train")

split <- initial_split(data)

# change split$in_id to include the predefined train samples
split$in_id <- train_ids

train_split <- training(split) %>% 
  select(-dataset)
test_split <- testing(split) %>% 
  select(-dataset)

all_equal(train, train_split)
#> [1] TRUE
all_equal(test, test_split)
#> [1] TRUE

reprex package (v0.3.0)

于 2020-09-22 创建

对拆分对象进行逆向工程很可能意味着简单地查看 rsplit 对象的构造。根据包的实现,这可以像使用与使用 initial_split 时出现的字段相同的字段重建对象一样简单。这很可能是这里的情况,因此我们只需重新创建对象并确保所有字段都可用。

然而,一种方法(可能是最简单的)是将两者结合起来 data.frames 并使用索引与 make_splits 一起重新创建原始拆分对

library(rsample)
library(dplyr)
combined <- bind_rows(train, test)
ind <- list(analysis = seq(nrow(train)), assessment = nrow(train) + seq(nrow(test)))
splits <- make_splits(ind, combined)
splits
<Analysis/Assess/Total>
<8/4/12>