3

我正在尝试从 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))
4

2 回答 2

5

对拆分对象进行逆向工程可能意味着简单地查看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>
于 2020-09-22T07:05:00.970 回答
3

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

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 包(v0.3.0)于 2020 年 9 月 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 包(v0.3.0)于 2020 年 9 月 22 日创建

于 2020-09-22T07:01:06.703 回答