r горячее кодирование для одной переменной в наборе данных - PullRequest
1 голос
/ 13 апреля 2020

У меня есть набор данных, в котором я хотел бы выполнить горячее кодирование одной переменной и построить модель (лм).

Эта переменная называется 'zone'.

Что я пытался сделать сделать это:

lm_model <- train(formula(paste0("price ~", paste0(features, collapse = " + "))),
                  data = predict(dummyVars( ~ "zone", data = data_train), newdata =  data_train), 
                  method = "lm", 
                  trControl = trainControl(method = "cv", number = 10),
                  preProcess = c("center", "scale"),
                  na.action=na.exclude
)

Я не уверен, что в отношении части, может кто-нибудь, пожалуйста, направьте меня сюда:

data = predict(dummyVars( ~ "zone", data = data_train), newdata =  data_train), 

1 Ответ

1 голос
/ 13 апреля 2020

Давайте воспользуемся примером с цил как категориальным из mtcars:

library(caret)
da <- mtcars
da$cyl <- factor(da$cyl)
# we can include cyl as features
features <- c("cyl","hp","drat","wt","qsec")
#our dependent is mpg

Мы проверим, что делает dummyVars:

    head(predict(dummyVars(mpg~.,data=da[,c("mpg",features)]),da))
                  cyl.4 cyl.6 cyl.8  hp drat    wt  qsec
Mazda RX4             0     1     0 110 3.90 2.620 16.46
Mazda RX4 Wag         0     1     0 110 3.90 2.875 17.02
Datsun 710            1     0     0  93 3.85 2.320 18.61
Hornet 4 Drive        0     1     0 110 3.08 3.215 19.44
Hornet Sportabout     0     0     1 175 3.15 3.440 17.02
Valiant               0     1     0 105 2.76 3.460 20.22

Вы можете видеть, что он вводит 3 двоичные переменные для цил, а также сохраняет непрерывные переменные. зависимая переменная не входит в этот прогноз (...)

Итак, для обучения:

onehot_data <- cbind(mpg=da$mpg,
predict(dummyVars(mpg~.,data=da[,c("mpg",features)]),da))

lm_model <- train(mpg ~.,data=onehot_data,  
                  method = "lm", 
                  trControl = trainControl(method = "cv", number = 10),
                  preProcess = c("center", "scale"),
                  na.action=na.exclude
)

И выдается предупреждение:

Warning messages:
1: In predict.lm(modelFit, newdata) :
  prediction from a rank-deficient fit may be misleading

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

Вам необходимо решить, какой из ваших категорий будет эталонным уровнем, и удалить этот столбец из фрейма одноразовых данных, например:

# i remove cyl.4
onehot_data = onehot_data[,-2]
lm_model <- train(mpg ~.,data=onehot_data,  
                  method = "lm", 
                  trControl = trainControl(method = "cv", number = 10),
                  preProcess = c("center", "scale"),
                  na.action=na.exclude
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...