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

使用R训练的Neural Net模型准确率为0%的原因排查求助

问题:大规模信贷数据集训练神经网络准确率始终为0%

项目背景:基于住房信贷数据集研究贷款决策机器学习算法的偏差检测与缓解,核心任务是预测客户还款能力(TARGET=1表示还款困难,0表示正常)。已将数据集按性别分为全体、女性、男性三组,每组拆分训练/测试集后训练神经网络模型,但无论怎么调整,训练集和测试集准确率始终为0%。此前仅处理过IRIS这类小型数据集,面对120列、30万行的大规模数据遇到瓶颈。

代码片段

# TRAINING
nn_model <- nnet(TARGET ~ ., data = new_train, size = 2, maxit = 100, decay = 0.1) # nolint
nn_pred <- predict(nn_model, newdata = new_train)
nn_accuracy <- mean((nn_pred > 0.5) == new_train$TARGET)
#  TESTING
nn_test_pred <- predict(nn_model, newdata = new_test)
nn_test_accuracy <- mean((nn_test_pred > 0.5) == new_test$TARGET)
# Print accuracies
cat("Shallow Neural Net Accuracy on Train Data: ", round(nn_accuracy * 100, 4), "%", "\n",  sep = "") # nolint
cat("Shallow Neural Net Accuracy on Test Data: ", round(nn_test_accuracy * 100, 4), "%", "\n",  sep = "") # nolint

已尝试的解决方法

  • 将字符列转换为因子类型
  • 仅对数值列进行缩放而非全部列
  • 将TARGET列设置为因子类型
  • 减少训练时使用的列数
  • 调整隐藏层单元数量
  • 修改最大迭代次数

排查与解决思路

1. 优先验证数据分布与模型任务类型

信贷数据集普遍存在类别严重不平衡问题(TARGET=1样本占比极低),但准确率0%更可能是模型任务类型错误导致:

  • 先统计训练集类别分布:table(new_train$TARGET),确认两类样本数量。
  • 默认情况下,nnet会根据目标变量类型自动选择任务:如果TARGET是数值型(0/1),模型会执行回归任务,输出连续值;如果是因子型,才会执行分类任务。若你设置TARGET为因子但未在预测时指定type="class",输出仍会是概率值,此时阈值0.5可能完全不匹配模型输出范围。

修改后的分类任务代码示例:

# 显式将TARGET转为因子(指定类别顺序)
new_train$TARGET <- factor(new_train$TARGET, levels = c(0, 1))
new_test$TARGET <- factor(new_test$TARGET, levels = c(0, 1))

# 训练分类神经网络,打开trace查看收敛过程
nn_model <- nnet(TARGET ~ ., data = new_train, size = 10, maxit = 500, decay = 0.01, trace = TRUE)
# 预测类别而非概率
nn_pred <- predict(nn_model, newdata = new_train, type = "class")
nn_accuracy <- mean(nn_pred == new_train$TARGET)

nn_test_pred <- predict(nn_model, newdata = new_test, type = "class")
nn_test_accuracy <- mean(nn_test_pred == new_test$TARGET)

cat("Shallow Neural Net Accuracy on Train Data: ", round(nn_accuracy * 100, 4), "%\n", sep = "")
cat("Shallow Neural Net Accuracy on Test Data: ", round(nn_test_accuracy * 100, 4), "%\n", sep = "")

2. 排查数据预处理问题

  • 缺失值与异常值:检查各列缺失情况colSums(is.na(new_train)),若某列缺失率过高或存在无穷值,会导致模型无法有效学习。
  • 特征缩放:nnet对特征尺度极度敏感,确保所有数值特征都缩放到统一范围(比如[0,1]或[-1,1]),避免大数值特征主导模型权重。
  • 类别特征编码:确认测试集中没有出现训练集未见过的因子水平,否则会导致预测失败。

3. 调整模型参数提升容量与收敛性

  • 增加隐藏层单元数:size=2对于120维特征来说容量不足,尝试size=10、20甚至更高。
  • 提高迭代次数:maxit=100可能不足以让模型收敛,尝试maxit=500或1000,通过trace=TRUE观察损失值是否持续下降。
  • 降低衰减系数:decay=0.1可能过度惩罚权重,尝试decay=0.01、0.001,甚至先设为0排除正则化干扰。

4. 用基准模型定位问题

先训练简单的逻辑回归模型验证数据有效性:

lr_model <- glm(TARGET ~ ., data = new_train, family = binomial)
lr_pred <- predict(lr_model, newdata = new_train, type = "response")
lr_accuracy <- mean((lr_pred > 0.5) == new_train$TARGET)
cat("Logistic Regression Accuracy: ", round(lr_accuracy * 100, 4), "%\n", sep = "")

如果逻辑回归准确率也为0%,说明数据预处理环节存在严重问题;如果逻辑回归有正常准确率,则问题集中在神经网络的参数或任务设置上。


内容的提问来源于stack exchange,提问作者jonathan anders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:35:30