【发布时间】:2018-06-19 11:48:13
【问题描述】:
我正在使用 R 中的 NeuralNet 包来训练人工神经网络,并且能够毫无问题地训练模型。但是,当我使用相同数量的隐藏节点重新运行模型,然后根据我的测试数据评估我的结果时,我会得到截然不同的结果。我正在阅读论坛帖子,有人建议它与随机起始权重有关,并建议设置种子。我一直非常坚持我的种子,但我仍然得到非常不同的结果。有没有人遇到过类似的问题?如果是这样,你做了什么来解决不一致的问题。此外,我所有的 IV 都是数字,我没有缺失值。
这是我的代码和输出:
#min-max norm the dt vars
normalize = function(x){
return((x-min(x))/(max(x) - min(x)))
}
#make a smaller dt so it is easier to work with
nrows = nrow(dt.norm)
sm.size = 10000
set.seed(7)
sm.index = sample(nrows, sm.size, replace = FALSE)
dt.norm.sm = dt.norm[sm.index,]
#Split into training and testing
nrows = nrow(dt.norm.sm)
train.size = floor(0.7*nrows)
set.seed(7)
train.idx = sample(nrows, train.size, replace = F)
dt.sm.train = dt.norm.sm[train.idx, ]
dt.sm.test = dt.norm.sm[-train.idx, ]
#train model on the data
ann.form = as.formula(paste('Pure_Prem ~', paste(names(dt.sm.train[-24]),
collapse = '+'))) #24 is the dv
pure_prem_model = neuralnet(ann.form, data = dt.sm.train, hidden = 3)
#evaluate model performance
model_results = neuralnet::compute(pure_prem_model, dt.sm.test[1:23])
#exclude 24 because it is the DV
predicted_pure_prem = model_results$net.result
cor(predicted_pure_prem, dt.sm.test$Pure_Prem)
我的输出是:
[1,] 0.007210471996
当我再次重新运行完全相同的代码时,我的输出是:
[1,] 0.4554126927
提前谢谢你。
【问题讨论】:
-
你一定要播种。我之前在 Kaggle 上看到这个的地方是当你设置种子后使用的一些函数在内部调用随机种子。如果种子极大地改变了你的结果,那是一个很大的危险信号,表明你的模型结果不是很一致。
-
我上面的评论是一般答案,可能但不一定适用于此。为了让我们验证这个案例,您能否提供一个可重现的示例?如果你用 buitlin 数据集做,你有同样的问题吗?
-
在调用 neuralnet::neuralnet() 之前再尝试一个 set.seed。我认为这是你的问题,它与设置初始权重有关。附带说明一下,您可能还想尝试利用 neuralnet::neuralnet() 中的 rep 参数来改进训练。
-
你是对的。在神经网络模型修复它之前将种子设置在线上。谢谢
标签: r neural-network