我知道这是一个奇怪的问题,我什至不能给出 MRE,但希望其他人也遇到过类似的问题并解决了它,我发布了这个问题。
我一直在使用 Rattle 和所有可用的模型。我想单独使用 nnet,自己检查结果并更好地控制参数。
在某些时候,我打开了熵开关(我没有那么多变量和因素),这导致了错误。我将开关转回默认值(FALSE),但从那时起 nnet 就再也无法正常工作。即使在 Rattle 内部,它也不适用于我使用了 100 次的训练集。我能够得到概率分数,现在 Rattle 给了我所有其他模型的概率分数,但不是 nnet。Nnet 仍然产生二进制输出,即使在 Rattle Score 选项中选择了“概率”。
有没有人遇到过类似的nnet问题?
编辑:代码部分是:
mnnet <- nnet(response1 ~ ., data=dftr, size=10, skip=TRUE, MaxNWts=100000, trace=FALSE, maxit=100)
增加 MaxNWts 似乎正在解决错误,too many weights
但现在需要很长时间才能运行并消耗大量内存。使用相同的数据集,我能够在不到一分钟的循环中运行许多训练规模的可能性。(我在 16GB 的 Mac Book Pro 上)我们谈论的是一组约 10000 行和大约 20 个功能。
以前完美运行的示例代码:
pldata <- data.frame(nobs = NA,
ntrain = NA,
ntest = NA,
error = NA
)
#
obssize <- seq(0.8, 1.0, 0.1)
trsize <- seq(0.5, 0.8, 0.05)
#
set.seed(1234)
for (i in obssize){
ind1 <- sample(nrow(df), i * nrow(df))
dfp <- df[ind1,]
size <- nrow(dfp)
for (j in trsize){
ind2 <- sample(nrow(dfp), j * nrow(dfp))
dftr <- dfp[ind2, ]
dftest <- dfp[-ind2, ]
mnnet <- nnet(response1 ~ ., data=dftr, size=20, skip=TRUE, MaxNWts=10000, trace=FALSE, maxit=100)
nnetp <- predict(mnnet, newdata = dftest)
nnetp <- factor(nnetp, levels = levels(dftr$response1))
cfm <- table(nnetp, dftest$response1)
mcrate <- (length(nnetp) - sum(diag(cfm))) / length(nnetp)
trainsize <- nrow(dftr)
testsize <- nrow(dftest)
temp <- data.frame(nobs = size, ntrain = trainsize, ntest = testsize, error = mcrate)
pldata <- rbind(pldata, temp)
}
}
#
pldata <- pldata[2:nrow(pldata),]
现在模型构建部分不起作用,更不用说把它放在一个循环中了。
编辑2:检查参数并发布发生了什么:
mnnet <- nnet(response1 ~ ., data=dftr, size=10, skip=TRUE, MaxNWts=100000, trace=FALSE, maxit=100, entropy = FALSE)
> mnnet$entropy
[1] TRUE
一旦熵设置为“真”,似乎不可能将其设置回默认值。