python-2.7 - 如何在 scikit_learn 中的 KFold 中使用 shuffle

标签 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)结果。
如果我使用随机播放,如果我多次重复相同的运行并且“最佳值”不可重复,我会得到不同的平均值(cv 错误)。
我可以理解我应该为每次 KFold 传递获得不同的 cv_errors,但最终平均值应该相同。
带 shuffle 的 KFold 是如何工作的?
每次调用 KFold 时,它都会打乱我的索引并生成训练/测试数据。它如何为“训练/测试”选择不同的折叠?它是否有一种随机方式来选择不同的折叠进行训练/测试?
任何情况下它对“洗牌”有利,而情况则不是?

最佳答案

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

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

关于python-2.7 - 如何在 scikit_learn 中的 KFold 中使用 shuffle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237127/

相关文章:

python - 安装一半的包和python循环依赖

python-2.7 - 等待 Jenkins 构建完成

python - 在 Python 中使用 format() 方法打印 boolean 值 True/False

python - 如何从 sklearn 朴素贝叶斯分类器获得 nbest 预测? -Python

python - NLTK SklearnClassifier 错误

machine-learning - 使用 PassiveAggressiveClassifier 的partial_fit 在 Scikit 中进行增量学习

python - 使用 Google map 进行地理编码时出现 403 错误

python - 当跨模块派生类时,名称解析如何工作?

python - 如何仅使用 TfidfVectorizer 获取 TF?

python - 如何优化大型数据集的标签编码(sci-kit learn)