Tidymodels:根据训练和测试数据创建rsplit对象 逆向工程

问题描述

我正在尝试从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,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),feature_1 = c(5,13,8,9),feature_2 = c(132,105,99,112))

解决方法

对拆分对象进行反向工程可能意味着仅查看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>
,

我可以考虑使用initial_time_split(),因为它需要训练的第一个道具样本,而不是随机选择的。

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

train <- tibble(predictor = c(0,1,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),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,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,test_split)
#> [1] TRUE

reprex package(v0.3.0)于2020-09-22创建