如何在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
相关产品推荐
相关产品推荐

