2013-07-03 22 views
22

Sto tentando di imparare a lavorare con le reti neurali in R. Come problema di apprendimento, ho utilizzato following problemKaggle:Lavorare con neuralnet in R per la prima volta: ottenere "richiede argomenti di matrice/vettore numerici/complessi"

Non preoccuparti, questo problema è progettato specificamente per le persone con cui imparare, non c'è alcun premio legato ad esso.

Ho iniziato con una semplice regressione logistica, che è stata ottima per bagnarmi i piedi. Ora mi piacerebbe imparare a lavorare con le reti neurali. I miei dati formazione si presenta così (Colonna: Riga):

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

Il mio codice di partenza R è simile al seguente:

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

Quando eseguo questa riga di codice ottengo il seguente errore:

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

Capisco che il problema è nel modo in cui sto presentando le mie variabili di input, ma sono troppo novizio per capire cosa devo fare per correggere questo. Qualcuno può aiutare?

Grazie!

+2

Guardando i tuoi dati all'inizio, credo che tu abbia convertito tutti i dati in valori numerici. E.g cabin = c85, cosa significa? Se si convertono i valori di questo tipo in numerici, il problema verrà risolto. – user1471980

risposta

35

Prima di dare ciecamente i dati al computer, è una buona idea di vedere le cose:

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) 

Alcune delle variabili hanno troppi valori per essere utile (almeno nel primo modello): è possibile rimuovere il nome, il biglietto, la cabina e il passeggero. Potresti anche voler trasformare alcune delle variabili numeriche (ad esempio, classe), in fattori, se è più significativo.

Dal neuralnet si occupa solo con variabili quantitative, è possibile convertire tutte le variabili qualitative (fattori) a variabili binarie ("fittizi"), con la funzione di model.matrix - è una delle situazioni molto rare in quale R non esegue la trasformazione per te.

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 
) 
+1

Grazie!Questo è esattamente il tipo di risposta che speravo. Grazie per aver dedicato del tempo a rispondere in modo così dettagliato. – user2548029

+0

Grazie per questo! Ho una domanda @VincentZoonekynd, c'è una regola definita per quali variabili sono applicabili alla conversione di 'model.matrix'? –

+1

@llorgge: tutte le variabili qualitative, cioè quelle di tipo 'factor' (o' character'), verranno trasformate in variabili dummy. Ma dal momento che le variabili numeriche vengono mantenute, non trasformate, puoi effettivamente inserire tutte le variabili. –

6

Messaggio di errore "richiede argomenti a matrice/vettore numerico/complesso" quando si hanno variabili fattore o carattere nei dati.

Ci sono tre modi per risolvere questo problema:

  1. eliminare la variabile
  2. Se la variabile è un fattore ordinata, utilizzare integer invece.
  3. Se la variabile è un carattere, trasformarlo in fattore e quindi in variabile fittizia.

È possibile utilizzare model.matrix() menzionato in precedenza o la funzione class.ind() dal pacchetto nnet per trasferire il fattore nella variabile dummy.

+0

È con mia sorpresa poiché SPSS ha bisogno di inserire le variabili Fattore separatamente nella casella designata. – Espanta