提问人:MoHaMaD rEzA 提问时间:12/12/2022 最后编辑:MoHaMaD rEzA 更新时间:12/13/2022 访问量:193
插入符号中的Nnet,基本结构
Nnet in caret, basic structure
问:
我对 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 而不是插入符号)。
答:
使用 str() 函数并确定它是一个数据帧,看起来像您正在向 train 函数输入列表。这可能是因为您之前正在执行输出转换。
str(output)
如果没有早期步骤的完整脚本,就很难理解发生了什么。
评论
[.data.frame
在尝试了不同的东西和搜索之后,我终于找到了解决方案:
首先,我们必须用来显示输入和输出之间的关系。使用下面的代码,我们不需要单独添加所有变量: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)
这也适用于包:caret
net1 = train(a, data = all_data, method= "nnet", maxit = 1000)
但它似乎工作得更快(至少在我的情况下)。neuralnet
我希望这对其他人有所帮助。
评论