You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让神经网络算法收敛以完成绘图?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:43:13