web-dev-qa-db-fra.com

Travailler avec neuralnet dans R pour la première fois: obtenir "nécessite des arguments matriciels / vectoriels numériques / complexes"

Je suis en train d'essayer d'apprendre à travailler avec des réseaux de neurones dans R. En tant que problème d'apprentissage, j'ai utilisé le problème suivant sur Kaggle :

Ne vous inquiétez pas, ce problème est spécialement conçu pour que les gens apprennent, il n'y a aucune récompense qui y soit liée.

J'ai commencé par une simple régression logistique, ce qui était parfait pour me mouiller les pieds. Maintenant, j'aimerais apprendre à travailler avec les réseaux de neurones. Mes données d'entraînement ressemblent à ceci (colonne: ligne):

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

Mon code R de départ ressemble à ceci:

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

Lorsque j'exécute cette ligne de code, j'obtiens l'erreur suivante:

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

Je comprends que le problème réside dans la façon dont je présente mes variables d'entrée, mais je suis trop novice pour comprendre ce que je dois faire pour corriger cela. Quelqu'un peut-il aider?

Merci!

25
user2548029

Avant de donner aveuglément les données à l'ordinateur, c'est une bonne idée de les regarder:

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)

Certaines variables ont trop de valeurs pour être utiles (au moins dans votre premier modèle): vous pouvez supprimer le nom, le ticket, la cabine et l'ID passager. Vous pouvez également vouloir transformer certaines des variables numériques (par exemple, la classe), en facteurs, si cela est plus significatif.

Puisque neuralnet ne traite que des variables quantitatives, vous pouvez convertir toutes les variables qualitatives (facteurs) en variables binaires ("factices"), avec les model.matrix fonction - c'est l'une des très rares situations où R n'effectue pas la transformation pour vous.

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
)
41
Vincent Zoonekynd

Le message d'erreur "nécessite des arguments matriciels/vectoriels numériques/complexes" se produit lorsque vous avez des variables de facteur ou de caractère dans vos données.

Il existe trois façons de résoudre ce problème:

  1. Supprimer la variable
  2. Si la variable est un facteur ordonné, utilisez plutôt un entier.
  3. Si la variable est un caractère, transformez-la en facteur puis en variable fictive.

Vous pouvez utiliser la fonction model.matrix () mentionnée ci-dessus ou la fonction class.ind () du package nnet pour transférer le facteur dans une variable fictive.

7
Tara