Сохраните имена столбцов для createDummyFeatures "reference" (n-1) - PullRequest
0 голосов
/ 26 марта 2019

У меня есть такие данные.

library(dplyr)

glimpse(samp)
Observations: 5
Variables: 5
$ review_count               <int> 68, 3, 7, 9, 5
$ Alcohol                    <fct> full_bar, NA, full_bar, beer_and_wi...
$ BikeParking                <fct> True, NA, False, NA, NA
$ BusinessAcceptsBitcoin     <fct> NA, NA, NA, NA, NA
$ BusinessAcceptsCreditCards <fct> True, NA, NA, True, True

Я хочу создать 1-p фиктивные объекты. Функция createDummyFeatures пакета mlr имеет опцию reference, чтобы сделать это.

library(mlr)
dummy = createDummyFeatures(samp, target = "review_count", method = "reference")

Проблема в том, что он не сохраняет исходные имена столбцов.

glimpse(dummy)
Observations: 5
Variables: 6
$ review_count     <int> 68, 3, 7, 9, 5
$ Alcohol.full_bar <dbl> 1, NA, 1, 0, NA
$ Alcohol.none     <dbl> 0, NA, 0, 0, NA
$ True             <dbl> 1, NA, 0, NA, NA
$ True.1           <dbl> NA, NA, NA, NA, NA
$ True.2           <dbl> 1, NA, NA, 1, 1

Вопрос в том, как я могу их сохранить?

Идея состоит в том, чтобы создать их методом 1-of-n, а затем удалить все столбцы, содержащие "False".

dummy2 = createDummyFeatures(samp, target = "review_count")

dummy2 = dummy2 %>%
  select(-contains("False"))

glimpse(dummy2)
Observations: 5
Variables: 7
$ review_count                    <int> 68, 3, 7, 9, 5
$ Alcohol.beer_and_wine           <dbl> 0, NA, 0, 1, NA
$ Alcohol.full_bar                <dbl> 1, NA, 1, 0, NA
$ Alcohol.none                    <dbl> 0, NA, 0, 0, NA
$ BikeParking.True                <dbl> 1, NA, 0, NA, NA
$ BusinessAcceptsBitcoin.True     <dbl> NA, NA, NA, NA, NA
$ BusinessAcceptsCreditCards.True <dbl> 1, NA, NA, 1, 1

Однако я не знаю, совпадает ли это с n-1, особенно для факторов с более чем 2 уровнями (фиктивное кодирование предназначено для регрессии XGBoost, где "счетчик просмотров" является целевой переменной).

dput(samp)
structure(list(review_count = c(68L, 3L, 7L, 9L, 5L), Alcohol = structure(c(2L, 
NA, 2L, 1L, NA), .Label = c("beer_and_wine", "full_bar", "none"
), class = "factor"), BikeParking = structure(c(2L, NA, 1L, NA, 
NA), .Label = c("False", "True"), class = "factor"), BusinessAcceptsBitcoin = structure(c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), .Label = c("False", 
"True"), class = "factor"), BusinessAcceptsCreditCards = structure(c(2L, 
NA, NA, 2L, 2L), .Label = c("False", "True"), class = "factor")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

Редактировать

Для тех, у кого такая же проблема, я исправил эту проблему, используя caret.

library(caret)
dummy_dat = dummyVars("~ .", data = samp, fullRank = T)

dat = data.frame(predict(dummy_dat, newdata = samp))
...