R中caret包K折交叉验证时preProcess能否规避特征缩放的数据泄露
结论
你当前的代码写法可以完全规避K折交叉验证中特征缩放带来的数据泄露问题。
caret包train()函数的preProcess参数的执行逻辑是内嵌在每一轮交叉验证的拆分流程中的,具体执行顺序如下:
- 每一轮交叉验证首先拆分出当前轮的内部训练集、验证集
- 仅基于当前轮的内部训练集计算特征缩放所需的均值、标准差统计量
- 用上述统计量分别对当前轮的内部训练集做缩放、对验证集做缩放
- 用缩放后的内部训练集训练模型,用缩放后的验证集做评估
整个过程不会用到验证集的统计信息计算缩放参数,也不会用到全量训练集的全局统计参数,完全符合无泄露的特征缩放规范。
补充说明
你所担心的数据泄露场景,是提前对完整的training_set做全局特征缩放之后再传入train()跑交叉验证的情况:这种情况下每轮验证集的统计信息已经被包含在全局缩放的统计量里,才会导致偏误。你现在直接在train()里指定preProcess的写法是正确的。
另外后续你在测试集上做预测时,不需要手动对测试集做缩放,直接调用predict(model, newdata = test_set)即可,caret会自动用全量训练集拟合得到的缩放参数处理测试集,不会引入泄露。
内容的提问来源于stack exchange,提问作者Meth Bandaranaike
相关产品推荐
相关产品推荐

