Python 使用ShuffleSplit在后续运行中获得相同的学习曲线

Python 使用ShuffleSplit在后续运行中获得相同的学习曲线,python,scikit-learn,Python,Scikit Learn,我在scikit learn中的学习曲线生成方面遇到了一个特别奇怪的问题。生成学习曲线的脚本的后续运行返回相同的结果。如果我更改ShuffleSplit对象或learning curve对象的任何参数,我将在两次运行之间得到不同的结果。但如果我保持这些参数不变,输出将是相同的 我将ShuffleSplit对象设置为10%用于训练,10%用于测试,以及3次迭代。我这样做是为了避免培训/测试集的内容可能是相同的,即使它们的顺序不同。ShuffleSplit应该采用随机索引来生成每个集合(我已经验证了

我在scikit learn中的学习曲线生成方面遇到了一个特别奇怪的问题。生成学习曲线的脚本的后续运行返回相同的结果。如果我更改ShuffleSplit对象或learning curve对象的任何参数,我将在两次运行之间得到不同的结果。但如果我保持这些参数不变,输出将是相同的

我将ShuffleSplit对象设置为10%用于训练,10%用于测试,以及3次迭代。我这样做是为了避免培训/测试集的内容可能是相同的,即使它们的顺序不同。ShuffleSplit应该采用随机索引来生成每个集合(我已经验证了它是这样做的)。因此,如果训练集在后续运行中有所不同,即使是很小的差异,Bayes模型也应该有不同的训练和测试错误,对吗

它看起来几乎像是在缓存分数,直到ShuffleSplit对象或learning_curve方法的参数出现,它才返回缓存的结果。我想不出任何其他解释。有什么想法吗

以下是一个简化的问题示例,基于scikit学习示例代码和数据集,位于:


您可以使用关键字参数
random\u state
主动更改
shuffliesplit
对象的随机种子

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(n_samples, n_iter=10, test_size=.1, random_state=42)

通过每次创建cv对象时更改此选项,您应该会获得不同的结果。

您可以使用关键字参数
random\u state
主动更改
shuffliesplit
对象的随机种子

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(n_samples, n_iter=10, test_size=.1, random_state=42)

通过每次创建cv对象时更改此选项,您应该会获得不同的结果。

您可以使用关键字参数
random\u state
主动更改
shuffliesplit
对象的随机种子

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(n_samples, n_iter=10, test_size=.1, random_state=42)

通过每次创建cv对象时更改此选项,您应该会获得不同的结果。

您可以使用关键字参数
random\u state
主动更改
shuffliesplit
对象的随机种子

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(n_samples, n_iter=10, test_size=.1, random_state=42)

通过在每次创建cv对象时更改此选项,您应该会获得不同的结果。

这就成功了,但我仍然对发生的事情感到困惑。ShuffleSplit类返回两个索引列表——一个用于列车集,另一个用于测试集。我验证了这些索引在后续运行中是不同的,那么如果随机状态变量与索引无关,它到底在做什么呢?一次交叉验证运行包括数据的
n\u iter
分割。这些都是不同的(概率极高),因为它们是按顺序随机选择的。但是,如果将种子固定为某个整数,则整个cv,即所有
n_iter
拆分将完全相同,即使生成了两次。这是因为就在生成之前,随机数生成器用种子初始化,然后从中提取数字。这些数字是完全确定的。通过更改种子,您将获得一个不同的cv对象,该对象的分割完全不同。如果未指定
random\u state
参数,则每次分割的cv对象也会不同。我想,如果你想让其他人能够准确地再现结果,那么指定随机_状态是很有用的。这确实起到了作用,但我仍然不清楚到底发生了什么。ShuffleSplit类返回两个索引列表——一个用于列车集,另一个用于测试集。我验证了这些索引在后续运行中是不同的,那么如果随机状态变量与索引无关,它到底在做什么呢?一次交叉验证运行包括数据的
n\u iter
分割。这些都是不同的(概率极高),因为它们是按顺序随机选择的。但是,如果将种子固定为某个整数,则整个cv,即所有
n_iter
拆分将完全相同,即使生成了两次。这是因为就在生成之前,随机数生成器用种子初始化,然后从中提取数字。这些数字是完全确定的。通过更改种子,您将获得一个不同的cv对象,该对象的分割完全不同。如果未指定
random\u state
参数,则每次分割的cv对象也会不同。我想,如果你想让其他人能够准确地再现结果,那么指定随机_状态是很有用的。这确实起到了作用,但我仍然不清楚到底发生了什么。ShuffleSplit类返回两个索引列表——一个用于列车集,另一个用于测试集。我验证了这些索引在后续运行中是不同的,那么如果随机状态变量与索引无关,它到底在做什么呢?一次交叉验证运行包括数据的
n\u iter
分割。这些都是不同的(概率极高),因为它们是按顺序随机选择的。但是,如果将种子固定为某个整数,则整个cv,即所有
n_iter
拆分将完全相同,即使生成了两次。这是因为就在生成之前,随机数生成器用种子初始化,然后从中提取数字。这些数字是完全确定的。通过更改种子,您将获得一个不同的cv对象,该对象的分割完全不同。如果未指定
random\u state
参数,则每次分割的cv对象也会不同。我想,如果你想让其他人能够准确地再现结果,那么指定随机_状态是很有用的。这确实起到了作用,但我仍然不清楚到底发生了什么。ShuffleSplit类返回两个索引列表——一个用于列车集,另一个用于测试集。我验证了这些索引在后续运行中是不同的,那么如果随机_状态变量