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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:48:01