6

我正在使用 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)。如果我使用随机播放,如果我多次重复相同的运行并且“最佳值”不可重复,我会得到不同的平均值(cv-errors)。我可以理解,对于每个 KFold 通道,我应该得到不同的 cv_errors,但最终的平均值应该是相同的。带有 shuffle 的 KFold 是如何真正起作用的?每次调用 KFold 时,它都会打乱我的索引并生成训练/测试数据。它如何为“培训/测试”选择不同的折叠方式?它是否有随机方式来选择不同的折叠进行训练/测试?任何与“洗牌”有关的情况和不是的情况?

4

1 回答 1

10

如果 shuffle 为 True,则首先对整个数据进行 shuffle,然后拆分为 K-Folds。对于可重复的行为,您可以将 random_state 设置为例如整数种子 (random_state=0)。如果您的参数依赖于改组,这意味着您的参数选择非常不稳定。可能你的训练数据很少,或者你习惯了很少的折叠(比如 2 或 3)。

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

于 2012-09-02T20:18:36.137 回答