如何让神经网络算法收敛以完成绘图?R代码报错求助
解决neuralnet包算法不收敛及绘图报错问题
我使用R语言的nnet和neuralnet包进行破产预测,编写并运行了以下代码:
library(nnet) library(neuralnet) bank.nnet <- nnet(Bankrupt ~ .,data = test.set, size = 1, maxit = 500, type='class') prob.nnet = predict(bank.nnet, test.set) pred.nnet = as.numeric(prob.nnet > 0.06) table(test.set$Bankrupt, pred.nnet, dnn = c("Observation", "Prediction")) mean(ifelse(test.set$Bankrupt != pred.nnet, 1, 0)) n=6 bank.nnet.tune <- nnet(Bankrupt ~ ., size = n, data = train.set, maxit=1000, decay=0.006, linout = TRUE) prob.nnet.tune.train = predict(bank.nnet.tune, train.set) pred.nnet.tune.train = as.numeric(prob.nnet.tune.train > 0.06) #table(bank.test$DLRSN, pred.nnet.tune.train, dnn = c("Observation", "Prediction")) table(train.set$Bankrupt, pred.nnet.tune.train, dnn = c("Observation", "Prediction")) mean(ifelse(train.set$Bankrupt != pred.nnet.tune.train, 1, 0)) #outofsample prob.nnet.tune = predict(bank.nnet.tune, train.set) pred.nnet.tune = as.numeric(prob.nnet.tune > 0.06) table(train.set$Bankrupt, pred.nnet.tune, dnn = c("Observation", "Prediction")) mean(ifelse(train.set$Bankrupt != pred.nnet.tune, 1, 0)) library(verification) data$Bankrupt=as.factor(data$Bankrupt) #roc.plot(bank.test$DLRSN == "1", pred.nnet.tune) nn <- neuralnet(Bankrupt ~ X1+X2+X3+X4+X5+X6+X7+X8+X9+X10, data=train.set,hidden=c(8,1),linear.output=T) plot(nn)
运行最后一行plot(nn)时,出现以下警告和错误:
Warning message:
Algorithm did not converge in 1 of 1 repetition(s) within the stepmax.
Error in plot.nn(nn) : weights were not calculated
我尝试将linear.output设置为FALSE,但问题仍未解决,请问如何优化算法使其收敛,从而完成神经网络的绘图?
优化方案及代码调整
针对算法不收敛的问题,可以从以下几个维度调整参数和数据处理方式:
1. 数据标准化
神经网络对特征尺度极度敏感,先将所有输入特征标准化到统一尺度(如均值为0、方差为1),消除尺度差异对训练的影响:
# 标准化训练集特征(仅针对输入变量) train_scaled <- train.set feature_cols <- c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10") train_scaled[, feature_cols] <- scale(train_scaled[, feature_cols])
2. 调整神经网络结构
当前设置的hidden=c(8,1)属于双隐藏层结构,参数较多易导致收敛困难。先简化为单隐藏层,减少神经元数量:
# 改为单隐藏层,5个神经元 hidden = c(5)
3. 增大迭代步数
neuralnet默认的stepmax为100000,若算法未收敛,可手动调大该值,给模型足够的迭代次数:
stepmax = 1e6 # 增大到100万步
4. 调整学习率
学习率过大易导致训练震荡,过小则收敛过慢。设置适中的学习率(如0.01)平衡收敛速度与稳定性:
learningrate = 0.01
5. 匹配问题类型设置参数
破产预测是二分类问题,需将linear.output设为FALSE,配合合适的激活函数(如tanh或默认的logistic)输出概率值:
linear.output = FALSE act.fct = "tanh" # 可选,替换默认的logistic激活函数
修改后的完整训练代码
library(neuralnet) # 数据标准化 train_scaled <- train.set feature_cols <- c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10") train_scaled[, feature_cols] <- scale(train_scaled[, feature_cols]) # 训练优化后的神经网络 nn <- neuralnet(Bankrupt ~ X1+X2+X3+X4+X5+X6+X7+X8+X9+X10, data=train_scaled, hidden=c(5), linear.output=FALSE, stepmax=1e6, learningrate=0.01, act.fct="tanh") # 绘图 plot(nn)
内容的提问来源于stack exchange,提问作者Emily Paula
相关产品推荐
相关产品推荐

