RStudio使用nnet训练银行营销预测模型出现NA/NaN/Inf报错如何解决
错误原因
- 核心问题:
nnet包要求输入特征为数值类型,你传入的输入数据bankData[A,c(1:4)]包含job、marital、education三个字符型分类特征,R强制将字符转换为数值时无法识别文本内容,生成大量NA值,触发NA/NaN/Inf in foreign function call报错。 - 次要逻辑问题:你已经通过
subset生成了筛选字段后的newbankData,但后续数据集划分、模型训练仍然使用原始bankData,代码逻辑不一致。
修复方案
推荐使用nnet的公式接口调用,接口会自动处理分类特征的编码转换,无需手动处理标签和特征类型,修复后完整代码如下:
# 读取数据集 bankData = read.csv("data/bank-additional.csv", sep = ";") # 筛选需要的建模字段 newbankData <- subset(bankData, select = c(age, job, marital, education, y)) library(nnet) # 设置随机种子保证结果可复现 set.seed(1) # 划分70%训练集、30%测试集索引 A <- sort(sample(nrow(newbankData), nrow(newbankData)*0.7)) train_data <- newbankData[A,] test_data <- newbankData[-A,] # 用公式接口训练模型,自动处理分类特征编码 bankData_net <- nnet(y ~ age + job + marital + education, data = train_data, size=3, maxit=100, softmax=TRUE) # 测试集预测 Yt <- predict(bankData_net, test_data, type="class") # 生成混淆矩阵 conf.matrix <- table(test_data$y, Yt) rownames(conf.matrix) <- paste("Actual", rownames(conf.matrix)) colnames(conf.matrix) <- paste("Pred", colnames(conf.matrix)) print(conf.matrix)
如果你需要坚持使用矩阵输入接口,需要先手动将分类特征转换为独热编码,示例代码片段如下:
# 生成独热编码特征矩阵,自动处理分类变量 x_features <- model.matrix(~ age + job + marital + education -1, data = newbankData) # 生成标签矩阵 Train_lab <- class.ind(newbankData$y) # 划分数据集训练 A <- sort(sample(nrow(x_features), nrow(x_features)*0.7)) bankData_net <- nnet(x_features[A,], Train_lab[A,], size=3, maxit=100, softmax=TRUE)
内容的提问来源于stack exchange,提问作者monoctis
相关产品推荐
相关产品推荐

