Джулия поспорила со мной, чтобы она получила карму. У меня был тот же ответ (я делаю то, что она делает, но медленнее):
Это разновидность ошибки, и мы работаем над тем, чтобы она не была ошибкой. Это сложно. Позволь мне объяснить.
ranger
- один из немногих пакетов R, метод формул которых не создает фиктивные переменные (разумно, поскольку они им не нужны).
Инфраструктура в tune
использует пакет workflows
для обработки формулы, а затем передает полученные данные в ranger
. По умолчанию , рабочие процессы создают фиктивные переменные, и, поскольку некоторые из ваших уровней факторов не являются допустимыми именами столбцов R (например, "general long term"
), ranger()
выдает ошибку.
(я знаю, что вы не использовали рабочий процесс, но именно это происходит под капотом).
Мы работаем над тем, что лучше всего сделать, поскольку большинство пользователей не знают, что многие пакеты моделей на основе дерева не создают фиктивных переменных. Чтобы сделать его более сложным, parsnip
не использует рабочие процессы (пока) и не выдает ошибку.
Решение на данный момент
Используйте простой рецепт вместо формулы:
library(tidymodels)
#> ── Attaching packages ─────────────────────────────────────────────────────────────────────────────────── tidymodels 0.1.0 ──
#> ✓ broom 0.5.4 ✓ recipes 0.1.10
#> ✓ dials 0.0.4 ✓ rsample 0.0.5
#> ✓ dplyr 0.8.5 ✓ tibble 2.1.3
#> ✓ ggplot2 3.3.0 ✓ tune 0.0.1
#> ✓ infer 0.5.1 ✓ workflows 0.1.0
#> ✓ parsnip 0.0.5 ✓ yardstick 0.0.5
#> ✓ purrr 0.3.3
#> ── Conflicts ────────────────────────────────────────────────────────────────────────────────────── tidymodels_conflicts() ──
#> x purrr::discard() masks scales::discard()
#> x dplyr::filter() masks stats::filter()
#> x dplyr::lag() masks stats::lag()
#> x ggplot2::margin() masks dials::margin()
#> x recipes::step() masks stats::step()
df<-structure(list(a = c(1379405931, 732812609, 18614430, 1961678341,
2362202769, 55687714, 72044715, 236503454, 61988734, 2524712675,
98081131, 1366513385, 48203585, 697397991, 28132854), b = structure(c(1L,
6L, 2L, 5L, 7L, 8L, 8L, 1L, 3L, 4L, 3L, 5L, 7L, 2L, 2L), .Label = c("CA",
"IA", "IL", "LA", "MA", "MN", "TX", "WI"), class = "factor"),
c = structure(c(2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L,
2L, 2L, 2L, 1L), .Label = c("R", "U"), class = "factor"),
d = structure(c(3L, 3L, 1L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 1L,
3L, 2L, 3L, 1L), .Label = c("CAH", "LTCH", "STH"), class = "factor"),
e = structure(c(3L, 2L, 3L, 3L, 1L, 3L, 3L, 3L, 2L, 4L, 2L,
2L, 3L, 3L, 3L), .Label = c("cancer", "general long term",
"psychiatric", "rehabilitation"), class = "factor")), row.names = c(NA,
-15L), class = c("tbl_df", "tbl", "data.frame"))
library(tidymodels)
library(ranger)
rf_spec <- rand_forest(mode = 'regression') %>%
set_engine('ranger')
rf_folds <- vfold_cv(df, strata = c)
fit_resamples(recipe(a ~ ., data = df), rf_spec, rf_folds)
#> # 10-fold cross-validation using stratification
#> # A tibble: 9 x 4
#> splits id .metrics .notes
#> * <list> <chr> <list> <list>
#> 1 <split [13/2]> Fold1 <tibble [2 × 3]> <tibble [0 × 1]>
#> 2 <split [13/2]> Fold2 <tibble [2 × 3]> <tibble [0 × 1]>
#> 3 <split [13/2]> Fold3 <tibble [2 × 3]> <tibble [0 × 1]>
#> 4 <split [13/2]> Fold4 <tibble [2 × 3]> <tibble [0 × 1]>
#> 5 <split [13/2]> Fold5 <tibble [2 × 3]> <tibble [0 × 1]>
#> 6 <split [13/2]> Fold6 <tibble [2 × 3]> <tibble [0 × 1]>
#> 7 <split [14/1]> Fold7 <tibble [2 × 3]> <tibble [0 × 1]>
#> 8 <split [14/1]> Fold8 <tibble [2 × 3]> <tibble [0 × 1]>
#> 9 <split [14/1]> Fold9 <tibble [2 × 3]> <tibble [0 × 1]>
# FYI `tune` 0.0.2 will require a different argument order:
# rf_spec %>% fit_resamples(recipe(a ~ ., data = df), rf_folds)
Создано в 2020-03-20 путем представительный пакет (v0.3.0)