Подтвердить что ты не робот

Работа с neuralnet в R в первый раз: get "требует числовых/сложных матричных/векторных аргументов"

Я пытаюсь научиться работать с нейронными сетями в Р. Как проблема обучения, я использовал следующую проблему в Kaggle:

Не волнуйтесь, эта проблема специально предназначена для людей, с которыми можно учиться, там нет вознаграждения.

Я начал с простой логистической регрессии, и это было здорово для моих ног. Теперь я хотел бы научиться работать с нейронными сетями. Мои данные обучения выглядят следующим образом (Column: Row):

- survived: 1
- pclass:   3
- sex:      male
- age:      22.0
- sibsp:    1
- parch:    0
- ticket:   PC 17601
- fare:     7.25
- cabin:    C85
- embarked: S

Мой стартовый код R выглядит так:

> net <- neuralnet(survived ~ pclass + sex + age + sibsp +
                   parch + ticket + fare + cabin + embarked, 
                   train, hidden=10, threshold=0.01)

Когда я запускаю эту строку кода, я получаю следующую ошибку:

Error in neurons[[i]] %*% weights[[i]] : 
  requires numeric/complex matrix/vector arguments

Я понимаю, что проблема в том, как я представляю свои входные переменные, но я слишком много начинаю, чтобы понять, что мне нужно сделать, чтобы исправить это. Может ли кто-нибудь помочь?

Спасибо!

4b9b3361

Ответ 1

Прежде чем слепо предоставить данные компьютеру, это хорошая идея, чтобы посмотреть на это:

d <- read.csv("train.csv")
str(d)
# 'data.frame': 891 obs. of  12 variables:
#  $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
#  $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
#  $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
#  $ Name       : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
#  $ Sex        : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
#  $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
#  $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
#  $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
#  $ Ticket     : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
#  $ Fare       : num  7.25 71.28 7.92 53.1 8.05 ...
#  $ Cabin      : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
#  $ Embarked   : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
summary(d)

Некоторые из переменных имеют слишком много значений, которые будут полезны (по крайней мере, в вашей первой модели): вы можете удалить имя, билет, каюту и пассажир. Вы также можете изменить некоторые числовые переменные (скажем, класс), на факторы, если он более значим.

Поскольку neuralnet касается только количественных переменных, вы можете преобразовать все качественные переменные (факторы) к двоичным ("dummy") переменным, с функцией model.matrix это одна из очень редких ситуаций в котором R не выполняет преобразование для вас.

m <- model.matrix( 
  ~ Survived + Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, 
  data = d 
)
head(m)
library(neuralnet)
r <- neuralnet( 
  Survived ~ Pclass + Sexmale + Age + SibSp + Parch + Fare + EmbarkedC + EmbarkedQ + EmbarkedS, 
  data=m, hidden=10, threshold=0.01
)

Ответ 2

Сообщение об ошибке "требует числовых/сложных матричных/векторных аргументов", если у вас есть переменные фактора или символа в ваших данных.

Существует три способа решения этой проблемы:

  • Удалить переменную
  • Если переменная является упорядоченным фактором, используйте вместо нее целое число.
  • Если переменная является символом, преобразуйте ее в коэффициент, а затем в фиктивную переменную.

Вы можете использовать упомянутую выше модель .matrix() или функцию class.ind() из пакета nnet для передачи фактора в фиктивную переменную.