【问题标题】:Preprocessing on GridsearchCVGridsearchCV 上的预处理
【发布时间】:2019-09-05 14:52:08
【问题描述】:

我正在使用GridsearchCV 调整超参数,现在我想在训练和验证步骤中做一个最小值-最大值Normalization(StandardScaler())。但我认为我不能这样做。

问题是:

  1. 如果我对整个训练集应用预处理步骤并将其发送到 GridsearchCV 进行 10 foldCV。这会导致我数据泄露,对吧?因为训练集将运行 10 折,这意味着训练 9 折和测试折 1 折。标准化应该只适用于训练集而不是验证集,对吗?
  2. 如果我使用 sklearn 的 Pipeline 不会解决这个问题吧?因为它只运行一次并导致我再次泄露数据。
  3. 还有其他方法可以做到这一点,并且仍然使用GridsearchCV 来调整参数

【问题讨论】:

    标签: python scikit-learn cross-validation grid-search 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 倍策略。我说的对吗?
    • 将会发生什么,对于每个折叠,标准缩放器将安装在训练部分,然后将用于使用在训练中计算的统计数据来转换测试部分。这里没有验证,对于每个折叠它只有一个训练和测试拆分。
    • 我在我的答案中添加了一篇文章,应该会有所帮助。
    猜你喜欢
    • 2020-04-18
    • 2021-12-28
    • 2017-09-08
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2012-03-20
    • 2021-01-23
    相关资源
    最近更新 更多