如何在scikit_learn中使用KFold中的shuffle

时间:2012-09-02 15:19:03

标签: python-2.7 scikit-learn

我使用scikit-learn提供的KFold函数运行10倍CV,以便选择一些内核参数。我正在实现这个(grid_search)程序:

1-pick up a selection of parameters
2-generate a svm
3-generate a KFold
4-get the data that correspons to training/cv_test
5-train the model (clf.fit)
6-classify with the cv_testdata
7-calculate the cv-error 
8-repeat 1-7
9-When ready pick the parameters that provide the lowest average(cv-error)

如果我在KFold代中不使用shuffle,如果我重复相同的运行并且“最佳结果”是可重复的,那么我得到的平均值(cv_errors)的结果非常相同。 如果我使用shuffle,如果我重复相同的运行几次并且“最佳值”不可重复,则我得到平均值(cv-errors)的不同值。 我可以理解,我应该为每个KFold传递获得不同的cv_errors,但最终的平均值应该是相同的。 带有shuffle的KFold如何真正起作用? 每次调用KFold时,它都会对我的索引进行洗牌,并生成训练/测试数据。它如何为“训练/测试”挑选不同的折叠?是否有随机方式选择不同的折叠进行培训/测试? 任何情况下,它有利于“洗牌”和情况不是??

1 个答案:

答案 0 :(得分:8)

如果shuffle为True,则首先对整个数据进行洗牌,然后将其拆分为K-Folds。对于可重复的行为,您可以将random_state设置为整数种子(random_state = 0)。 如果您的参数取决于混洗,则表示您的参数选择非常不稳定。可能你只有非常少的训练数据,或者你使用很少的折叠(如2或3)。

如果您的数据以某种方式按类排序,则“shuffle”主要是有用的,因为每个折叠可能只包含来自一个类的样本(特别是对于随机梯度体面分类器,排序类是危险的)。 对于其他分类器,它应该没有区别。如果改组非常不稳定,那么您的参数选择可能没有信息(也就是垃圾)。