关于r-torch回归任务中数据集x与y定义的语法疑问
核心结论:绝对不能把目标变量y包含在x特征矩阵里
这是典型的数据泄露问题,要是把y放进x里,模型训练时直接就能看到要预测的答案,训练出来的结果在测试集上会一塌糊涂——真实场景下你要预测的时候根本拿不到y的值,模型等于白训。
你的代码修改点
1. 修正torch数据集的x矩阵构建
在initialize函数里,构建x矩阵时要明确排除目标列target:
self$x <- as.matrix(df %>% select(-target)) %>% # 这里去掉target列 torch_tensor()
2. 调整输入维度d_in
原来的d_in = 44是包含target列的特征数,去掉后特征数应该是43,必须同步修改,否则网络输入维度不匹配会报错:
d_in <- 43 # 去掉target后的特征列数
修改后的完整数据集初始化代码
torch_ds <- dataset( name = "torch_dataset()", initialize = function(df) { vars <- df %>% select_if(is.factor) %>% colnames() # 获取分类变量名(已转为因子) df[vars] <- lapply(df[vars], as.numeric) self$x <- as.matrix(df %>% select(-target)) %>% # 排除目标变量 torch_tensor() self$y <- torch_tensor(as.matrix(df$target)) # 定义目标变量 }, .getitem = function(i) { list(x = self$x[i, ], y = self$y[i]) }, .length = function() { dim(self$x)[1] } )
补充说明
训练神经网络做回归时,x是模型用来“推理”的输入特征,y是模型要预测的结果。模型的核心任务是学习x到y的映射关系,如果把y放进x,模型根本不需要学习,直接输出y就行,完全失去了预测的意义。
另外注意:训练集和测试集都要遵循这个规则,绝对不能让测试集的x包含target列,否则测试结果也是无效的。
内容的提问来源于stack exchange,提问作者Adverse Effect
相关产品推荐
相关产品推荐

