插入符号中的Nnet,基本结构

Nnet in caret, basic structure

提问人:MoHaMaD rEzA 提问时间:12/12/2022 最后编辑:MoHaMaD rEzA 更新时间:12/13/2022 访问量:193

问:

我对 R 中的插入符号包和 nnet 非常陌生。我以前用Matlab做过一些与ANN相关的项目,但现在我需要使用R,我需要一些基本的帮助。 我的输入数据集有 1000 个观测值(以行为单位)和 23 个变量(以列为单位)。我的输出有 1000 个观测值和 12 个变量。

以下是一些代表我的数据集的示例数据,可能有助于更好地理解我的问题:

input = as.data.frame(matrix(sample(1 : 20, 100, replace = TRUE), ncol = 10))
colnames(input) = paste ( "X" , 1:10, sep = "") #10 observations and 10 variables

output = as.data.frame(matrix(sample(1 : 20, 70, replace = TRUE), ncol = 7))
colnames(output) = paste ( "Y" , 1:7, sep = "") #10 observations and 7 variables


#nnet with caret:
net1 = train(output ~., data = input, method= "nnet", maxit = 1000) 

当我运行代码时,出现以下错误:

错误:变量“output”的类型(列表)无效。

我想我必须单独添加所有输出变量(这很烦人,尤其是有很多变量),如下所示:

train(output$Y1 + output$Y2 + output$Y3 + output$Y4 + output$Y5 +
 output$Y6 + output$Y7 ~., data = input, method= "nnet", maxit = 1000)

这次它运行了,但我收到此错误:

(data, , all.vars(Terms), drop = FALSE) 中的错误: 未定义的已选择列[.data.frame

我尝试使用neuralnet包,下面的代码可以完美运行,但我仍然必须单独添加输出变量:(

net1 = neuralnet(output$Y1 + output$Y2 + output$Y3 + output$Y4 +
 output$Y5 + output$Y6 + output$Y7 ~., data = input, hidden=c(2,10))

p.s. 由于这些样本数据是随机创建的,因此 neuralnet 无法收敛,但在我的真实数据中它运行良好(与 Matlab ANN 相比)

现在,如果你能帮我找到一种自动(而不是手动)放置输出变量的方法,它解决了我的问题(尽管使用 neuralnet 而不是插入符号)。

神经网络 R-CALET NNET

评论


答:

0赞 Chathura Perera 12/12/2022 #1

使用 str() 函数并确定它是一个数据帧,看起来像您正在向 train 函数输入列表。这可能是因为您之前正在执行输出转换。

str(output)

如果没有早期步骤的完整脚本,就很难理解发生了什么。

评论

0赞 MoHaMaD rEzA 12/12/2022
它是数据帧。str(output): 'data.frame': 1000 obs. of 12 variables: 我想我必须在输出中单独添加所有变量,如下所示: train(output$X1 + output$X2 + output$X3 + ... + output$X12 ~. , data = input, method= “nnet”, maxit = 1000) 这样,它运行了,但最后,我收到另一个错误: 错误 (data, , all.vars(Terms), drop = FALSE) : 未定义的已选择列[.data.frame
0赞 Chathura Perera 12/12/2022
您能否分享一些有助于理解该问题的示例数据
0赞 MoHaMaD rEzA 12/12/2022
我添加了一个新答案,其中包含一些可以很好地代表我的数据集的数据。
0赞 MoHaMaD rEzA 12/13/2022 #2

在尝试了不同的东西和搜索之后,我终于找到了解决方案:

首先,我们必须用来显示输入和输出之间的关系。使用下面的代码,我们不需要单独添加所有变量:as.formula

names1 <- colnames(output) #the name of our variables in the output
names2 = colnames(input) #the name of our variables in the input

a <- as.formula(paste(paste(names1,collapse='+', sep = ""),' ~ ' 
                      ,paste(names2,collapse='+', sep = "")))

然后,我们必须将输入和输出组合到一个数据帧中:

all_data = cbind(output, input)

然后,像这样使用:neuralnet

net1 = neuralnet(formula = a, data = all_data, hidden=c(2,10))

plot(net1)

plot(net1)

这也适用于包:caret

net1 = train(a, data = all_data, method= "nnet", maxit = 1000)

但它似乎工作得更快(至少在我的情况下)。neuralnet

我希望这对其他人有所帮助。