【问题标题】:Tidymodels: Creating an rsplit object from training and testing dataTidymodels:从训练和测试数据创建一个 rsplit 对象
【发布时间】:2020-09-22 06:22:53
【问题描述】:

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

【问题讨论】:

  • 我非常同意 Julia 和 Andrew 的教程很有帮助

标签: r tidymodels


【解决方案1】:

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

【讨论】:

【解决方案2】:

我可以考虑使用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 package (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 package (v0.3.0) 于 2020 年 9 月 22 日创建

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 2015-07-16
    • 1970-01-01
    • 2017-04-07
    • 2021-03-14
    • 2016-10-04
    • 2019-10-23
    相关资源
    最近更新 更多