运行R语言神经网络代码时遇“subscript out of bounds”下标越界报错求助
解决R语言neuralnet模型报错:
subscript out of bounds 报错核心原因
这个错误本质是预测用的数据集和训练模型的数据集不匹配,你的代码里存在几个关键问题:
- 变量名混乱:混用
data2、d2、d1但未明确三者关系,导致采样索引、训练/测试集的维度、变量完全不对应 compute()传入的d1[,c(1:5)],和训练模型时用的d2特征列数/列名不一致,模型找不到对应变量触发下标越界- RMSE计算逻辑错误:用全量
data2$quality和基于d1的预测结果做计算,两者行数不匹配
具体修复步骤
1. 统一数据集命名与结构
先明确数据集关系,假设data2是包含目标列quality的完整数据集,统一用一套命名避免混乱:
# 拆分特征与目标变量(如果还没做) features <- data2[, !names(data2) %in% "quality"] target <- data2$quality
2. 修正训练/测试集采样逻辑
确保采样索引和数据集行数严格对应,避免跨数据集采样导致维度错误:
for(j in 10:65){ for(i in 1:k){ # 从完整数据集采样j行作为训练集索引 index <- sample(1:nrow(data2), j) train_data <- data2[index, ] # 训练集(含特征+目标) test_data <- data2[-index, ] # 测试集(含特征+目标) test_features <- test_data[, !names(test_data) %in% "quality"] # 测试集特征
3. 匹配训练与预测的数据集
训练模型时用采样后的训练集,而非全量d2;预测时传入和训练集特征完全一致的测试集特征:
# 用训练集训练模型 NN <- neuralnet(quality~., data = train_data, hidden=10, linear.output = TRUE) # 传入测试集特征做预测(列数/列名和训练集完全匹配) predict_testNN <- compute(NN, test_features)
4. 修正RMSE计算的维度匹配
用测试集的真实目标值和对应预测结果计算RMSE,而非全量数据集的目标值:
# 反归一化(保持和原代码逻辑一致,用全量数据集的极值) predict_testNN <- (predict_testNN$net.result*(max(target)-min(target)))+min(target) # 计算测试集的RMSE RMSE.NN[i] <- sqrt(sum((test_data$quality - predict_testNN)^2)/nrow(test_data)) } List[[j]] <- RMSE.NN }
5. 补全依赖包加载
你的代码里未安装/加载neuralnet包,这是运行模型的必要依赖,需补充:
install.packages("neuralnet") library(neuralnet)
完整修正后的代码
install.packages("boot") install.packages("plyr") install.packages("neuralnet") library(boot) library(plyr) library(neuralnet) set.seed(50) k <- 10 RMSE.NN <- NULL List <- list() # 假设data2是包含quality列的完整数据集,统一命名避免混乱 d2 <- data2 d1 <- d2[, !names(d2) %in% "quality"] for(j in 10:65){ for(i in 1:k){ index <- sample(1:nrow(d2), j) trainNN <- d2[index, ] testNN <- d2[-index, ] test_features <- testNN[, !names(testNN) %in% "quality"] NN <- neuralnet(quality~., data = trainNN, hidden=10, linear.output = TRUE) predict_testNN <- compute(NN, test_features) predict_testNN <- (predict_testNN$net.result*(max(d2$quality)-min(d2$quality)))+min(d2$quality) RMSE.NN[i] <- sqrt(sum((testNN$quality - predict_testNN)^2)/nrow(testNN)) } List[[j]] <- RMSE.NN } matrixRMSE <- do.call(cbind, List) matrixRMSE
内容的提问来源于stack exchange,提问作者linta
相关产品推荐
相关产品推荐

