step_num2factor () Использование - Tidymodel (пакет рецептов) - PullRequest
0 голосов
/ 02 мая 2020

Ну, я прочитал ссылку на функцию для step_num2factor и не понял, как правильно ее использовать, если честно.

temp_names <- as.character(unique(sort(all_raw$MSSubClass)))

price_recipe <-
     recipe(SalePrice ~ . , data = train_raw) %>%
step_num2factor(MSSubClass, levels  = temp_names)


temp_rec <- prep(price_recipe, training = train_raw, strings_as_factors = FALSE) # temporary recipe
temp_data <- bake(temp_rec, new_data = all_raw) # temporary data

class(all_raw$MSSubClass)
# > col_double() 
MSSubClass: Identifies the type of dwelling involved in the sale.

    20  1-STORY 1946 & NEWER ALL STYLES
    30  1-STORY 1945 & OLDER
    40  1-STORY W/FINISHED ATTIC ALL AGES
    45  1-1/2 STORY - UNFINISHED ALL AGES
    50  1-1/2 STORY FINISHED ALL AGES
    60  2-STORY 1946 & NEWER
    70  2-STORY 1945 & OLDER
    75  2-1/2 STORY ALL AGES
    80  SPLIT OR MULTI-LEVEL
    85  SPLIT FOYER
    90  DUPLEX - ALL STYLES AND AGES
   120  1-STORY PUD (Planned Unit Development) - 1946 & NEWER
   150  1-1/2 STORY PUD - ALL AGES
   160  2-STORY PUD - 1946 & NEWER
   180  PUD - MULTILEVEL - INCL SPLIT LEV/FOYER
   190  2 FAMILY CONVERSION - ALL STYLES AND AGES

Вывод данных temp_data$MSSubClass полон NA после использования шага. Объекты сохраняются как 20,30,40 .... 190, и я хочу преобразовать их в имена (или даже те же числа, но в качестве неупорядоченных факторов)

Если вам известно больше сообщений в блоге об использовании step_num2factor или некоторый код, который использует, я был бы рад видеть также.

Полный набор данных предоставляется kaggle по адресу: kaggle data

Спасибо заранее,

1 Ответ

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

Я не думаю, что step_num2factor() лучше всего подходит для этой переменной. Посмотрите на справку еще раз и обратите внимание, что вам нужно указать аргумент transform, который можно использовать для изменения значений цифр c до определения уровней. Это работало бы хорошо, если бы все эти данные были кратны 10, но у вас есть некоторые значения, такие как 75 и 85, поэтому я не думаю, что вы этого хотите. Этот шаг рецепта работает лучше всего для числовых / целочисленных i sh переменных, которые вы можете легко преобразовать в набор целых чисел с помощью простой функции.

Вместо этого, я думаю, вы должны подумать о step_mutate() и простое приведение к типу фактора:

library(tidyverse)
library(recipes)
#> 
#> Attaching package: 'recipes'
#> The following object is masked from 'package:stringr':
#> 
#>     fixed
#> The following object is masked from 'package:stats':
#> 
#>     step

train_raw <- read_csv("~/Downloads/house-prices-advanced-regression-techniques/train.csv")
#> Parsed with column specification:
#> cols(
#>   .default = col_character(),
#>   Id = col_double(),
#>   MSSubClass = col_double(),
#>   LotFrontage = col_double(),
#>   LotArea = col_double(),
#>   OverallQual = col_double(),
#>   OverallCond = col_double(),
#>   YearBuilt = col_double(),
#>   YearRemodAdd = col_double(),
#>   MasVnrArea = col_double(),
#>   BsmtFinSF1 = col_double(),
#>   BsmtFinSF2 = col_double(),
#>   BsmtUnfSF = col_double(),
#>   TotalBsmtSF = col_double(),
#>   `1stFlrSF` = col_double(),
#>   `2ndFlrSF` = col_double(),
#>   LowQualFinSF = col_double(),
#>   GrLivArea = col_double(),
#>   BsmtFullBath = col_double(),
#>   BsmtHalfBath = col_double(),
#>   FullBath = col_double()
#>   # ... with 18 more columns
#> )
#> See spec(...) for full column specifications.

price_recipe <-
  recipe(SalePrice ~ ., data = train_raw) %>%
  step_mutate(MSSubClass = factor(MSSubClass))

juiced_price <- prep(price_recipe) %>%
  juice()

levels(juiced_price$MSSubClass)
#>  [1] "20"  "30"  "40"  "45"  "50"  "60"  "70"  "75"  "80"  "85"  "90"  "120"
#> [13] "160" "180" "190"

juiced_price %>%
  count(MSSubClass)
#> # A tibble: 15 x 2
#>    MSSubClass     n
#>    <fct>      <int>
#>  1 20           536
#>  2 30            69
#>  3 40             4
#>  4 45            12
#>  5 50           144
#>  6 60           299
#>  7 70            60
#>  8 75            16
#>  9 80            58
#> 10 85            20
#> 11 90            52
#> 12 120           87
#> 13 160           63
#> 14 180           10
#> 15 190           30

Создано в 2020-05-03 пакетом Представить (v0.3.0)

Для меня это выглядит так, как будто вы получаете уровни факторов, которые вы хотите. Если вы хотите сохранить эти строки из файла .txt, например "1-STORY 1945 & OLDER", как вектор new_levels, вы можете сказать factor(MSSubClass, levels = new_levels).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...