在GridsearchCV上进行预处理

4

我正在使用 GridsearchCV 来调整超参数,现在我想在训练和验证步骤中进行 min-max 规范化(StandardScaler())。但我认为我不能这样做。

问题是:

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

2

确实,这会导致数据泄漏,很好你发现了!

使用管道的解决方案是,在管道中将StandardScaler作为第一个操作,然后选择分类器,并最终将此管道传递给GridSearchCV。

最初的回答:

这将导致数据泄露,非常好的是您已经发现了它!使用管道的解决方案是,在管道中使用StandardScaler作为第一步操作,然后选择分类器,最后将该管道传递给GridSearchCV。

clf = make_pipeline(StandardScaler(), 
                    MyClassifier())
grid_search = GridSearchCV(clf, refit=True)

想要了解更多信息,请查看这篇文章

IT技术相关内容:

最初的回答


1
感谢回答我的问题。StandardScaler()每次折叠更改时都会执行吗,还是仅在第一次(整个数据集)执行?有没有办法实施这些策略并防止数据泄漏? - Puntawat Ponglertnapakorn
是的,根据我上面的代码,它将在每个折叠上重新运行缩放器,如果您设置了refit=True,那么最终会在所有数据以及具有最佳超参数的模型上运行缩放器。这应该解决数据泄漏问题。 - Ahmed Ragab
听起来很不错。但是你怎么知道它会在每个折叠中重新运行呢?我的意思是,StandardScaler()应该运行2次:1.用于训练集,2.用于验证集,并且这两个步骤应该在10个折叠策略下运行10次。我说得对吗? - Puntawat Ponglertnapakorn
4
对于每一次交叉验证,都会对训练集进行标准化处理,然后使用在训练集上计算出的统计信息对测试集进行转换。这里没有验证集,每次交叉验证只有一个训练集和一个测试集。 - Ahmed Ragab
我已经在我的回答中添加了一篇文章,应该会有所帮助。 - Ahmed Ragab
你说得对。我从我的数据中分离出未见过的测试集,并将其余部分选择为训练集,进行了10折交叉验证。所以我称之为“训练折”和“验证折”。无论如何,就像你说的那样,StandardScaler() 将在每次训练折上重新运行并转换到验证折(也称为测试折)。如果我做得对,这将防止数据泄漏问题。非常感谢。 - Puntawat Ponglertnapakorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接