我正在使用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
提前谢谢。
答案 0 :(得分:1)
以下是我的评论中的一个例子。
设置数据:
data <- mtcars
samplesize <- 0.6 * nrow(data)
set.seed(7)
index <- sample(seq_len(nrow(data)), size = samplesize)
max <- apply(data , 2 , max)
min <- apply(data, 2 , min)
scale_df <- as.data.frame(scale(data, center = min, scale = max - min))
train <- scale_df[index , ]
test <- scale_df[-index , ]
设置NN
set.seed(6)
model_nn <- neuralnet::neuralnet(mpg ~ cyl + hp + wt, train, hidden = 3)
model_result <- neuralnet::compute(model_nn, test[,c(2,4,6)])
predicted_mpg <- model_result$net.result
cor(predicted_mpg, test$mpg)
输出始终为
[1,] 0.9310625412
如果在set.seed(6)
之前省略neuralnet::neuralnet()
,则5次迭代的输出为:
[1,] 0.9142345019
[1,] 0.8531440993
[1,] 0.9414393857
[1,] 0.9309926802
[1,] 0.9164132325
只需添加额外的set.seed
即可。希望能帮到你。
答案 1 :(得分:1)
我怀疑发生的事情是您正在调用set.seed
一次,但多次运行neuralnet
函数。
对set.seed
的调用只会在设置种子后第一次调用函数时产生相同的结果。例如
set.seed(1)
sample(10)
#[1] 3 4 5 7 2 8 9 6 10 1
如果你第二次调用相同的随机函数,你会得到不同的结果(但仍然是可重现的!)
sample(10)
#[1] 3 2 6 10 5 7 8 4 1 9
再次致电种子,亲眼看看。
set.seed(1)
sample(10)
# [1] 3 4 5 7 2 8 9 6 10 1
sample(10)
# [1] 3 2 6 10 5 7 8 4 1 9
每次运行该功能时,这将为您提供一个新结果,但是当您重新启动&#34;时,潜在结果的集合将重新开始。种子又来了。每次设置种子时,您都可以将其视为r
从相同的伪随机数开始,但是当您调用随机函数时,它会开始&#34;用完&#34;那组随机数。
所以你有几个选择1)你可以从头开始设置你的代码每次设置第一个种子,2)你可以在调用neuralnet
作为AndS之前专门设置一个种子。建议,或3)你可以从模型的第一次运行中提取一些起始权重,即
random_start_weights = pure_prem_mode$startweights
并在以后的所有运行中明确使用它们
pure_prem_model = neuralnet(ann.form, data = dt.sm.train, hidden = 3, startweights = random_start_weights)