R中的Neuralnet包大错误

Posted

技术标签:

【中文标题】R中的Neuralnet包大错误【英文标题】:Neuralnet package in R big error 【发布时间】:2014-01-07 02:02:21 【问题描述】:

我正在尝试弄清楚如何使神经网络包工作。我对我创建的数据及其结果进行了一些测试(大约 50 行数据和三列,第四列是我想要的结果,它是由简单的数学执行制成的,比如对其他三列求和),到目前为止一切都很好。然后我决定将包应用于真实数据。我从这里下载了 mpg 数据集http://vincentarelbundock.github.io/Rdatasets/datasets.html

我正在运行下面的代码:

net<- neuralnet(cty~displ+year+cyl+hwy,
                datain, hidden=3)

即使我有 3 个隐藏层,或者 8 个或 18 个,错误是相同的,并且包处理数据的时间相对于这个数据量(234 行)相对较小:

        Error Reached Threshold Steps
1 2110.173077    0.006277805853    54

对此有什么好的建议吗?

【问题讨论】:

到底是什么错误,我之前有用户神经网络,没有大问题 没有代码错误,但它给出了一个巨大的错误作为输出。我怎样才能最小化这个?它也没有时间分析数据,这让我觉得我没有正确应用这个...... 如果你想出来了,如果你喜欢就写评论吧! 先尝试scale你的输入变量。 我了解由于数据相关性不佳,可能会出现大错误。我对数据进行了缩放,假设您的意思是 scale() 函数,所以我得到 sd=1。但是,如果没有办法逆转缩放并将它们恢复到正常外观,那么现在的数据就没有任何意义了。 【参考方案1】:

我猜这是一个规模问题,您可以对其进行标准化或规模化。 scalingnormalizing 之间存在差异,它会影响您的结果,因此值得单独提出一个问题:

标准化输入

norm.fun = function(x) 
  (x - min(x))/(max(x) - min(x)) 


require(ggplot2) # load mpg dataset
require(neuralnet)

data = mpg[, c('cty', 'displ', 'year', 'cyl', 'hwy')]
data.norm = apply(data, 2, norm.fun)

net = neuralnet(cty ~ displ + year + cyl + hwy, data.norm, hidden = 2)

然后你可以对数据进行反规范化

# restore data 
y.net = min(data[, 'cty']) + net$net.result[[1]] * range(data[, 'cty'])
plot(data[, 'cty'], col = 'red')
points(y.net)

规模输入

data.scaled = scale(data)
net = neuralnet(cty ~ displ + year + cyl + hwy, data.scaled, hidden = 2)

# restore data 
y.sd = sd(data[, 'cty'])
y.mean = mean(data[, 'cty'])

y.net = net$net.result[[1]] * y.sd + y.mean
plot(data[, 'cty'], col = 'red')
points(y.net)

你也可以试试nnet包,速度非常快:

require(nnet)

data2 = mpg
data2$year = scale(data2$year)
fit = nnet(cty ~ displ + year + cyl + hwy, size = 10, data = data2, linout = TRUE)
plot(mpg$cty)
points(fit$fitted.values, col = 'red')

【讨论】:

如何逆转扩展过程,以便现在可以使用每加仑没有 cty 英里的数据来测试网络?顺便说一句,你的答案太棒了!!! 我指的是那个!我现在的问题是。例如,假设我们有以下数据: 2.4 (liters) 2003(model) 6(cyl) 25(hwy) 我们如何才能找回 cty?因为我们现在拥有的数据是按比例缩放的。 PS:令人惊讶的是,有人可以从 *** 中学到多少信息。 不客气。最后一件事:尝试使用线图代替点 - 差异会非常明显。 您好!我运行了代码,我可以看到缩放数据的错误比标准化的要大一些。但是,当我将数据转换回 deirmalization 时,会产生很大的差异,并且 descaling 更准确。什么是最好的方法?归一化还是缩放?因为我有红色,所以这些方法在统计中所代表的内容有所不同。 我编辑了反规范化的代码,因此它现在可以提供更好的输出 y.net =data.frame(min(data[, 'cty']) + data.norm[,'cty'] * (max(data[, 'cty'])-min(data[, 'cty']))))

以上是关于R中的Neuralnet包大错误的主要内容,如果未能解决你的问题,请参考以下文章

R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型

R - 神经网络 - 传统的反向传播似乎很奇怪

R语言neuralnet包构建神经网络模型:基于乳腺癌数据集

R使用neuralnet包构建神经网络回归模型并与线性回归模型对比实战

R中的“神经网络”包,整流线性单元(ReLU)激活函数?

60-R语言中的神经网络