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

如何在R中基于训练集缩放测试集的age特征以避免信息泄漏?

问题

我正在构建GBM分类器以预测某一目标变量。我的数据包含多个连续变量,仅需使用scale函数对其中的age特征进行缩放。为避免信息泄漏,需先缩放训练集的age,再基于训练集的规则缩放测试集的age,但我当前是分别缩放训练集和测试集的age,方法有误。现咨询如何在R(使用caret包)中正确实现,以下是我的现有代码:

for (i in (1:10)) {
  print(i)
  set.seed(i)
  
  IND = createDataPartition(y = MYData$Target_feature, p=0.8, list = FALSE)
  TRAIN_set = MYData[IND, ]
  TEST_set = MYData[-IND,]
  
  TRAIN_set$age = scale(TRAIN_set$age)
  TEST_set$age = scale(TEST_set$age)
  
  GBMModel <- train(Target_feature~., data = TRAIN_set,
                    method = "gbm",
                    metric="ROC",
                    trControl = ctrlCV,
                    tuneGrid = gbmGRID,
                    verbose = FALSE
                    
  )
  
  
  AUCs_Trn[i] = auc(roc(TRAIN_set$Target_feature,predict(GBMModel,TRAIN_set, type='prob')[,1]))
  AUCs_Tst[i] = auc(roc(TEST_set$Target_feature,predict(GBMModel,TEST_set, type='prob')[,1]))
  
}

注:我仅需缩放age特征。

正确实现方法

核心是复用训练集缩放时的均值和标准差来处理测试集,避免测试集信息提前流入训练流程。具体修改如下:

for (i in (1:10)) {
  print(i)
  set.seed(i)
  
  IND = createDataPartition(y = MYData$Target_feature, p=0.8, list = FALSE)
  TRAIN_set = MYData[IND, ]
  TEST_set = MYData[-IND,]
  
  # 对训练集age缩放并保存缩放规则(均值、标准差)
  scale_obj <- scale(TRAIN_set$age)
  TRAIN_set$age <- scale_obj
  
  # 用训练集的缩放规则处理测试集age
  TEST_set$age <- scale(TEST_set$age, 
                        center = attr(scale_obj, "scaled:center"), 
                        scale = attr(scale_obj, "scaled:scale"))
  
  GBMModel <- train(Target_feature~., data = TRAIN_set,
                    method = "gbm",
                    metric="ROC",
                    trControl = ctrlCV,
                    tuneGrid = gbmGRID,
                    verbose = FALSE
                    
  )
  
  
  AUCs_Trn[i] = auc(roc(TRAIN_set$Target_feature,predict(GBMModel,TRAIN_set, type='prob')[,1]))
  AUCs_Tst[i] = auc(roc(TEST_set$Target_feature,predict(GBMModel,TEST_set, type='prob')[,1]))
  
}

关键说明

  • scale()函数返回的对象附带scaled:center(训练集age的均值)和scaled:scale(训练集age的标准差)属性
  • 测试集的age必须用训练集的均值和标准差做标准化,这样才能保证缩放逻辑完全基于训练数据,杜绝信息泄漏
  • 这种方式仅对age特征做缩放,符合需求,其他特征不受影响

内容的提问来源于stack exchange,提问作者Programming Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:26:00