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 结果不佳

带有 RandomForestRegressor 的 param_grid 上的 GridSearchCV 错误

在 GridSearchCV 中对测试集进行预处理的问题

GridSearchCV上的自定义评分,具有折叠相关参数

scikit-learn 中 LogisticRegression 上的 GridSearchCV