Горячее кодирование сразу нескольких столбцов категориальных переменных

У меня есть набор данных португальского банка, который я получил из репозитория машинного обучения UCI, который организован следующим образом:

> head(bank_data)
             age       job marital   education default housing loan   contact month day_of_week       duration      campaign        pdays
1  1.53301567694 housemaid married    basic.4y      no      no   no telephone   may         mon  0.01047129616 -0.5659151042 0.1954115279
2  1.62897345569  services married high.school unknown      no   no telephone   may         mon -0.42149539806 -0.5659151042 0.1954115279
3 -0.29018211937  services married high.school      no     yes   no telephone   may         mon -0.12451829578 -0.5659151042 0.1954115279
4 -0.00230878311    admin. married    basic.6y      no      no   no telephone   may         mon -0.41378170709 -0.5659151042 0.1954115279
5  1.53301567694  services married high.school      no      no  yes telephone   may         mon  0.18788618843 -0.5659151042 0.1954115279
6  0.47748011065  services married    basic.9y unknown      no   no telephone   may         mon -0.23250996934 -0.5659151042 0.1954115279
       previous    poutcome emp.var.rate cons.price.idx cons.conf.idx    euribor3m  nr.employed targetVar
1 -0.3494900415 nonexistent 0.6480843991    0.722713697  0.8864358006 0.7124512301 0.3316758805        no
2 -0.3494900415 nonexistent 0.6480843991    0.722713697  0.8864358006 0.7124512301 0.3316758805        no
3 -0.3494900415 nonexistent 0.6480843991    0.722713697  0.8864358006 0.7124512301 0.3316758805        no
4 -0.3494900415 nonexistent 0.6480843991    0.722713697  0.8864358006 0.7124512301 0.3316758805        no
5 -0.3494900415 nonexistent 0.6480843991    0.722713697  0.8864358006 0.7124512301 0.3316758805        no
6 -0.3494900415 nonexistent 0.6480843991    0.722713697  0.8864358006 0.7124512301 0.3316758805        no

Я пытаюсь использовать эти данные для создания нейронной сети, используя либо пакет nnet, либо пакет neuralnet (в зависимости от того, что проще или в конечном итоге работает). Похоже, прежде чем я смогу создать сеть, я должен сначала преобразовать все категориальные переменные в бинарные решения.

Есть ли способ, которым я могу "горячо" кодировать все эти столбцы одновременно?

Я попытался использовать пакет mltools:

data <- one_hot(bank_data)

но это дает следующую ошибку:

Ошибка в [.data.frame(dt, , cols, with = FALSE): неиспользуемый аргумент (with = FALSE)


person zsad512    schedule 26.10.2017    source источник
comment
Другие возможные дубликаты: Как я могу сразу закодировать несколько переменных с большими данными в R или Как быстро закодировать факторные переменные с помощью data.table?. Я закрываю это, если решения в дубликатах не работают для вас, опубликуйте код, показывающий, что вы пробовали, и объясняющий, как результат отличается от ожидаемого.   -  person Gregor Thomas    schedule 26.10.2017
comment
Попробуйте model.matrix(targetVar ~ . + 0, data = bank_data)[, -1]   -  person Gregor Thomas    schedule 26.10.2017
comment
Упс, не обращайте внимания на [, -1] в моем последнем комментарии. Из-за + 0 в формуле он не нужен.   -  person Gregor Thomas    schedule 27.10.2017
comment
@Грегор, спасибо, это работает. Единственная проблема, которая у меня есть, заключается в том, что мне нужно также сохранить однократное кодирование targetVar... в настоящее время это удаляется в matrix.   -  person zsad512    schedule 27.10.2017
comment
Если они вам нужны в одной матрице, то не ставьте targetVar в левой части формулы: model.matrix(~ . + 0, data = bank_data). Но это звучит неправильно, я никогда не слышал о 1-горячем кодировании целевой переменной...   -  person Gregor Thomas    schedule 27.10.2017
comment
Кстати, вы упомянули, что можете использовать nnet. Если вы используете интерфейс формулы для nnet, то он позаботится о кодировании за вас — вы можете просто сделать nnet(targetVar ~ ., data = bank_data, <other options>).   -  person Gregor Thomas    schedule 27.10.2017
comment
@Грегор, что ты имеешь в виду, nnet сделает это за меня? Это то, что я пытался сделать! Пожалуйста объясните далее...   -  person zsad512    schedule 27.10.2017
comment
Если вы дадите nnet формулу, вам не нужно сразу кодировать. Это делает model.matrix для вас. Если вы даете nnet матрицу или фрейм данных, предполагается, что вы сделали это сами. В справке ?nnet раздел Подробности начинается с Если ответ в formula является фактором, создается соответствующая классификационная сеть.... Если у вас возникли проблемы с этим, я задаю отдельный вопрос. Возможно, также прочитайте этот вопрос, на который я ответил пару дней назад.   -  person Gregor Thomas    schedule 27.10.2017
comment
Можете ли вы сделать образец ваших данных воспроизводимым с помощью dput(head(your_data)), чтобы я мог исправить загадочную ошибку, которую вы получаете с помощью mltools?   -  person Ben    schedule 09.11.2017