我正在使用带有nnet方法的插入符号包。将maxit参数从300更改为500时,会得到不同的结果。我的理解是,如果maxit增加,则模型将经历“ n”次迭代的最大值,以找到局部最小值。
就我而言,将maxit设置为300而不是500时,我会得到很好的结果。
注意:两个模型中的种子值,tune_grid和折叠次数都不相同。
1)我得到不同的结果,因为在NN优化中有很多局部最小值?
2)越高,模型越好-对还是错? (基本假设是,如果模型未通过300次迭代收敛,则当迭代增加时它将收敛)
3)如何调整maxit参数?
答案 0 :(得分:0)
您指定的nnet
方法正在使用迭代优化(基础R中optim()
函数的BFGS方法)来估计模型[1]的参数。收敛时,优化应停止。如果maxit
设置得太低,则模型将无法收敛。
对于所有优化问题,不能保证BFGS方法收敛。但是,它被认为是一种很好的优化方法。优化表面取决于数据,因此我不会评论您案例的最小值的数量或性质。您可能在300次迭代中达到了局部最小值,但是nnet()
函数(设置随机权重)具有一定的随机性,因此即使所有nnet()
参数都相同,后续运行也可能有所不同。请注意,两个连续的nnet()
运行在相同的参数之间的区别-在100次迭代中分别为4.115351和2.112400。
library(nnet)
data(iris)
set.seed(42)
nnet(Species ~ ., data=iris, size=10)
# weights: 83
initial value 262.654300
iter 10 value 72.296066
iter 20 value 10.287034
iter 30 value 6.341659
iter 40 value 5.814649
iter 50 value 5.187836
iter 60 value 4.199448
iter 70 value 4.150082
iter 80 value 4.122058
iter 90 value 4.117969
iter 100 value 4.115351
final value 4.115351
stopped after 100 iterations
a 4-10-3 network with 83 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
output(s): Species
options were - softmax modelling
# Deliberately not setting seed value before second nnet run
nnet(Species ~ ., data=iris, size=10)
# weights: 83
initial value 201.869745
iter 10 value 67.631035
iter 20 value 11.863275
iter 30 value 6.542750
iter 40 value 5.758701
iter 50 value 5.355368
iter 60 value 3.970210
iter 70 value 2.835171
iter 80 value 2.414463
iter 90 value 2.226375
iter 100 value 2.112400
final value 2.112400
stopped after 100 iterations
a 4-10-3 network with 83 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
output(s): Species
options were - softmax modelling
还请注意,以上nnet()
行都没有收敛。这是一个融合模型的示例:
set.seed(42)
nnet(Species ~ ., data=iris, size=10, maxit=500)
# weights: 83
initial value 262.654300
iter 10 value 72.296066
iter 20 value 10.287034
# I've truncated the output here
iter 360 value 0.000277
iter 370 value 0.000117
final value 0.000097
converged
a 4-10-3 network with 83 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
output(s): Species
options were - softmax modelling
注意,在上面的输出中“收敛”。
不幸的是,无法使用插入符号maxit
的{{1}}选项来调整tune_grid
参数。在train
调用中为maxit
设置一个较高的值可能是合理的,但我不建议您使用该值,因为它还是与数据相关的。对于虹膜数据,我尝试使用一个比最大迭代次数高一个数量级或两个数量级的值。
或者,您可以遍历train
的值:
maxit
上面的循环会调整num.it <- 500 # max number of training iterations
fit.dat <- matrix(ncol=1, nrow=num.it) # fitting criterion values
for(i in 1:num.it) {
# to monitor progress
cat(i,'\n')
flush.console()
# to ensure same set of random starting weights are used each time
set.seed(42)
# temporary nnet model
mod.tmp <- nnet(Species ~ ., data=iris, size=10, maxit=i, trace=F)
# append fitting criterion value
fit.dat[i,] <- mod.tmp$value
}
# extract convergence values
which.min(fit.dat)
[1] 375
fit.dat[which.min(fit.dat)]
[1] 9.654717e-05
# plot fitting values
plot(fit.dat, type='l')
,但不会考虑过度拟合。更好的方法是将插入符号maxit
与当前的train()
和交叉验证设置一起使用。您还必须检查插入符号tune_grid
的输出是否收敛。
此外,插入符号和其他软件包的set.seed()也可能具有令人惊讶的可重复性问题:R: set.seed() results don't match if caret package loaded
最后,它不太可能提供帮助,但是看一下插入train()
函数的seeds
选项可能会很有趣。正如文档所述,它可能仅在运行并行作业时有用。