首次在R中使用神经网络:出现“需要数字/复杂矩阵/向量参数”错误

30

我正在尝试学习如何在R语言中使用神经网络进行编程。作为学习问题,我一直在使用Kaggle上的以下问题

不用担心,这个问题是专门为学习而设计的,没有任何奖励与之相关。

我从简单的逻辑回归开始,这对我初步了解非常有帮助。现在我想学习如何使用神经网络。我的训练数据如下(列:行):

- 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

我理解问题出在我的输入变量展示方式上,但是我太菜了,不知道该如何纠正。有人能帮忙吗?
谢谢!

3
初看你的数据,我认为你需要将所有数据转换为数值型。例如,小屋号码为c85,这代表什么意思?如果你将这种类型的数据转换成数值型,那么你的问题就会得到解决。 - user1471980
2个回答

54

在将数据盲目地交给计算机之前,最好先查看一下:

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函数将所有定性变量(因子)转换为二进制(“虚拟”)变量——这是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
)

1
谢谢!这正是我期望得到的回复。感谢您抽出时间如此详细地回复。 - user2548029
1
@llorgge:所有定性变量,即factor(或character)类型的变量,都将被转换为虚拟变量。但由于数值变量保持不变,因此您实际上可以放置所有变量。 - Vincent Zoonekynd
1
谢谢!最后一个问题,您建议在model.matrix之后可以接受多少个因子值用于neuralnet?我担心会失去一些取值范围从2到200的因子变量。 - user1685185
1
@llorgge:你应该在cross-validated上提问。 - Vincent Zoonekynd
对我来说,这个错误发生在predict函数中! neuralnet工作正常并适合训练集。然而,由于相同的“numeric/complex matrix/vector arguments”问题,模型无法预测训练集或测试集。有什么想法吗?@VincentZoonekynd 我使用model.matrix将两者都转换了,并且它们的列名匹配。 - Hadij
显示剩余2条评论

7

当您的数据中包含因子或字符变量时,将出现“需要数值/复合矩阵/向量参数”的错误消息。

有三种解决方法:

  1. 删除变量
  2. 如果变量是有序因子,请改用整数代替。
  3. 如果变量是字符型,请将其转换为因子,然后再转换为虚拟变量。

您可以使用上述model.matrix()函数或来自nnet包的class.ind()函数将因子转换为虚拟变量。


令我惊讶的是,SPSS需要您将因子变量单独放置在指定的框中。 - Espanta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接