GridsearchCV 上的预处理
Posted
技术标签:
【中文标题】GridsearchCV 上的预处理【英文标题】:Preprocessing on GridsearchCV 【发布时间】:2019-09-05 14:52:08 【问题描述】:我正在使用GridsearchCV
调整超参数,现在我想在训练和验证步骤中做一个最小值-最大值Normalization(StandardScaler())
。但我认为我不能这样做。
问题是:
-
如果我对整个训练集应用预处理步骤并将其发送到 GridsearchCV 进行 10 foldCV。这会导致我数据泄露,对吧?因为训练集将运行 10 折,这意味着训练 9 折和测试折 1 折。标准化应该只适用于训练集而不是验证集,对吗?
如果我使用 sklearn 的 Pipeline 不会解决这个问题吧?因为它只运行一次并导致我再次泄露数据。
还有其他方法可以做到这一点,并且仍然使用
GridsearchCV
来调整参数
【问题讨论】:
【参考方案1】:确实会造成数据泄露,被你抓到真是太好了!
使用管道的解决方案是将 StandardScaler 作为管道中的第一个操作,然后是您选择的分类器并最终将此管道传递给 GridSearchCV
clf = make_pipeline(StandardScaler(),
MyClassifier())
grid_search = GridSearchCV(clf, refit=True)
欲了解更多信息,请查看这篇文章here
【讨论】:
回答我的问题。 StandardScaler() 是在每次折叠发生变化时执行还是仅在第一次执行(整个数据集)时执行。有没有办法执行这些策略并防止数据泄露? 是的,给定我上面的代码,它会在每个折叠处重新运行缩放器,如果你有 refit=True,最终将在所有数据上运行缩放器以及具有最佳超参数的模型。这应该可以解决数据泄漏问题。 听起来不错。但是你怎么知道它会重新运行每一折。我的意思是 StandardScaler() 应该运行 2 次 1. 训练集和 2. 验证集,这两个步骤应该运行 10 次 10 倍策略。我说的对吗? 将会发生什么,对于每个折叠,标准缩放器将安装在训练部分,然后将用于使用在训练中计算的统计数据来转换测试部分。这里没有验证,对于每个折叠它只有一个训练和测试拆分。 我在我的答案中添加了一篇文章,应该会有所帮助。以上是关于GridsearchCV 上的预处理的主要内容,如果未能解决你的问题,请参考以下文章
工作管道上的 GridSearchCV 返回 ValueError
使用 keras 在虹膜上的 GridSearchCV 结果不佳