Напишите рабочий процесс для классификации, используя tidymodels. Получить "Ошибка: столбец` .row` должен иметь длину .. " - PullRequest
0 голосов
/ 05 мая 2020

Я хочу создать регуляризованную логистическую регрессионную модель c для прогнозирования класса в наборе данных о раке груди, найденном в пакете OneR. Я хочу поместить все это в аккуратный рабочий процесс с использованием фреймворка tidymodels.

library(tidymodels)
library(OneR)

#specify model
bc.lr = logistic_reg(
  mode="classification",
  penalty = tune(),
  mixture=1
) %>%
  set_engine("glmnet")

#tune penalty term using 4-fold cv
cv_splits<-vfold_cv(breastcancer,v=4,strata="Class")

#simple recipe to scale all predictors and remove observations with NAs
bc.recipe <- recipe (Class ~., data = breastcancer) %>%
  step_normalize(all_predictors()) %>%
  step_naomit(all_predictors(), all_outcomes()) %>%
  prep()

#set up a grid of tuning parameters
tuning_grid = grid_regular(penalty(range = c(0, 0.5)),
                           levels = 10,
                           original = F)

#put everything together into a workflow
bc.wkfl <- workflow() %>%
  add_recipe(bc.recipe) %>%
  add_model(bc.lr)

#model fit
tune = tune_grid(bc.wkfl,
                 resample = cv_splits,
                 grid = tuning_grid,
                 metrics = metric_set(accuracy),
                 control = control_grid(save_pred = T))


Я получаю странную ошибку, когда пытаюсь вызвать tune_grid.

Fold1: model 1/1 (predictions): Error: Column `.row` must be length ....

1 Ответ

1 голос
/ 15 мая 2020

Проблема здесь в обработке значений NA на шаге рецепта. Это шаг, на котором вам нужно хорошенько подумать о "пропуске" . Из этой статьи:

При выполнении повторной выборки или разделения обучения / тестирования некоторые операции имеют смысл для данных, которые будут использоваться для моделирования, но являются проблематичными c для новых образцов или набора тестов.

library(tidymodels)
#> ── Attaching packages ────────────────────────────────────────── tidymodels 0.1.0 ──
#> ✓ broom     0.5.6      ✓ recipes   0.1.12
#> ✓ dials     0.0.6      ✓ rsample   0.0.6 
#> ✓ dplyr     0.8.5      ✓ tibble    3.0.1 
#> ✓ ggplot2   3.3.0      ✓ tune      0.1.0 
#> ✓ infer     0.5.1      ✓ workflows 0.1.1 
#> ✓ parsnip   0.1.1      ✓ yardstick 0.0.6 
#> ✓ purrr     0.3.4
#> ── 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()
library(OneR)

lasso_spec <- logistic_reg(penalty = tune(), mixture = 1) %>%
  set_engine("glmnet")

## cross validation split
cancer_splits <- vfold_cv(breastcancer, v = 4, strata = Class)

## preprocessing recipe (note skip = TRUE)
cancer_rec <- recipe(Class ~ ., data = breastcancer) %>%
  step_naomit(all_predictors(), skip = TRUE) %>%
  step_normalize(all_predictors())

## grid of tuning parameters
tuning_grid <- grid_regular(penalty(),
                            levels = 10)

## put everything together into a workflow
cancer_wf <- workflow() %>%
  add_recipe(cancer_rec) %>%
  add_model(lasso_spec)

## fit
cancer_res <- tune_grid(
  cancer_wf,
  resamples = cancer_splits,
  grid = tuning_grid,
  control = control_grid(save_pred = TRUE)
)

cancer_res
#> #  4-fold cross-validation using stratification 
#> # A tibble: 4 x 5
#>   splits            id    .metrics          .notes           .predictions       
#>   <list>            <chr> <list>            <list>           <list>             
#> 1 <split [523/176]> Fold1 <tibble [20 × 4]> <tibble [0 × 1]> <tibble [1,760 × 6…
#> 2 <split [524/175]> Fold2 <tibble [20 × 4]> <tibble [0 × 1]> <tibble [1,750 × 6…
#> 3 <split [525/174]> Fold3 <tibble [20 × 4]> <tibble [0 × 1]> <tibble [1,740 × 6…
#> 4 <split [525/174]> Fold4 <tibble [20 × 4]> <tibble [0 × 1]> <tibble [1,740 × 6…

Создано 14 мая 2020 г. пакетом REPEX (v0.3.0)

Обратите внимание, что параметр skip = TRUE позволяет соответствующим образом обрабатывать значения NA для новых данных.

...