使用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
相关产品推荐
相关产品推荐

