web-dev-qa-db-ja.com

Rで初めてニューラルネットを操作する:「数値/複素数行列/ベクトル引数が必要」を取得する

私はRのニューラルネットワークでの作業を学習しようとしています。学習の問題として、 Kagglefollowing problem overを使用しています。

心配する必要はありません。この問題は、学習する人々のために特別に設計されており、それに関連する報酬はありません。

私は単純なロジスティック回帰から始めました。これは足を濡らすのに最適でした。ここで、ニューラルネットワークの操作方法を学びたいと思います。私のトレーニングデータは次のようになります(列:行):

- 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

私は問題が入力変数を提示している方法にあることを理解していますが、これを修正するために何をする必要があるかを理解するには初心者です。誰でも助けることができますか?

ありがとう!

25
user2548029

盲目的にコンピューターにデータを提供する前に、それを見ることをお勧めします。

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)

一部の変数には値が多すぎて有用ではありません(少なくとも最初のモデルでは)。名前、チケット、キャビン、パッセンジャーIDを削除できます。数値変数(クラスなど)の一部を、より意味のあるものに変換することもできます。

neuralnetは量的変数のみを処理するため、model.matrix関数を使用して、すべての質的変数(因子)をバイナリ(「ダミー」)変数に変換できます。これは非常にまれな状況の1つですこの場合、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
)
41

データに因子変数または文字変数がある場合、エラーメッセージ「数値/複素行列/ベクトル引数が必要」が発生します。

この問題を解決するには、次の3つの方法があります。

  1. 変数を削除する
  2. 変数が順序付けられた因子である場合、代わりに整数を使用します。
  3. 変数が文字の場合、因子に変換してからダミー変数に変換します。

上記のmodel.matrix()またはnnetパッケージのclass.ind()関数を使用して、因子をダミー変数に転送できます。

7
Tara