管道的变换器作用于训练数据而不是GridSearchCV中的整个数据

时间:2016-12-10 22:21:01

标签: machine-learning scikit-learn

我正在使用管道和GridSearchCV自动选择功能。由于数据集很小,我设置了参数' cv'在GridSearchCV到StratifiedShuffleSplit。代码如下所示:

selection = SelectKBest()

clf = LinearSVC()

pipeline = Pipeline([("select", selection), ("classify", clf)])

cv = StratifiedShuffleSplit(n_splits=50)

grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv = cv)

grid_search.fit(X, y)

似乎SelectKBest作用于每个分割的训练数据而不是整个数据集(后者是我想要的),因为如果我将选择分开,结果会变得不同。并且'分类',其中StratifiedShuffleSplit肯定只会对分类器起作用。

在这种情况下,使用管道和GridSearchCV的正确方法是什么?非常感谢!

2 个答案:

答案 0 :(得分:0)

交叉验证整个管道(即仅在每个分割的训练部分上运行SelectKBest)是要走的路。否则,允许模型查看测试部分 - 这意味着质量估计变得错误。在这些不公平的质量估算中发现的最佳超参数对于真实看不见的数据也可能更糟糕。

在预测时,您不会重新运行SelectKBest(训练数据集+要预测的示例),然后重新训练分类器,为什么要在评估中这样做?

答案 1 :(得分:0)

你也可以在书中找到第245页到第246页的这个问题的答案 - "统计学习的元素(第2版)"由哈斯蒂等人。