RStudio中使用Keras运行ISLR2第10章习题7出现ValueError报错求助
问题原因分析
- 变量名拼写错误:代码中训练集标签命名为
ytrain,但后续编码0/1时调用的是不存在的y_train,导致标签变量异常 - 损失函数与激活函数、标签格式不匹配:当前任务是二分类,输出层仅1个单元,使用
softmax激活时输出永远为1,不符合输出0-1概率的要求;同时categorical_crossentropy对应独热编码的多分类标签,与你使用的0/1整数标签不匹配 - 输入数据格式错误:keras要求训练输入为矩阵格式,你传入的
xtrain_mod是data.frame类型,会触发张量转换错误 - 未定义变量:生成测试集索引时用到的
ntest没有提前赋值,会导致样本拆分逻辑错误
修复后可运行代码
library(ISLR2) library(keras) ### 初始化参数 default <- Default n <- nrow(default) ntest <- floor(0.3 * n) # 定义测试集样本量,可按需求调整比例 testid.7 <- sample(1:n, ntest) x <- default[ ,c(2, 3, 4)] y <- default$default xtrain <- as.data.frame(x[-testid.7, ]) ytrain <- y[-testid.7] # 保持变量名一致 ## 标签编码为0/1 y_train_cat <- ifelse(ytrain == "Yes", 1, 0) ## 分类变量编码+转换为keras要求的矩阵格式 student_cat <- ifelse(xtrain$student == "Yes", 1, 0) xtrain_mod <- as.matrix(cbind(student_cat, xtrain$balance, xtrain$income)) ## 搭建神经网络 modnn.7 <- keras_model_sequential() %>% layer_dense(units = 10, activation = "relu", input_shape = c(3)) %>% layer_dropout(rate = 0.4) %>% layer_dense(units = 1, activation = 'sigmoid') # 二分类单输出改用sigmoid激活 modnn.7 %>% compile( loss = 'binary_crossentropy', # 匹配二分类的损失函数 optimizer = optimizer_rmsprop(), metrics = 'accuracy' ) history <- modnn.7 %>% fit ( xtrain_mod, y_train_cat, epochs = 200, batch_size = 50, validation_split = 0.2 # 可选:增加验证集避免过拟合 )
补充注意事项
- 后续测试集预测时,需要对测试集的
student字段做同样的0/1编码,且转换为矩阵格式后再输入模型 - Default数据集类别不平衡(违约样本占比极低),建议在训练时加入
class_weight参数调整类别权重,或使用AUC等更合理的评估指标代替准确率
内容的提问来源于stack exchange,提问作者dl4060
相关产品推荐
相关产品推荐

