Python 为什么SplitWithPiration每次调用时都会更改每个集合中的数量?

Python 为什么SplitWithPiration每次调用时都会更改每个集合中的数量?,python,python-2.7,neural-network,pybrain,Python,Python 2.7,Neural Network,Pybrain,使用2.7.6和0.3 这是我写的一个函数,用来创建一个数据集来训练我的神经网络 这是一个非常复杂的问题,我希望其中75%是培训数据,25%是测试数据(我相信这是一个可以接受的合理划分): 现在,我使用相同的数据调用了该函数两次,如下所示(由于表名和列名有点敏感,所以查询被掩盖了,对不起): 查看输出,我得到以下结果(实际上,每次运行它时,它都会发生变化): 这让我很困惑——为什么每次都会以不同的方式分割数据 由于数据集顺序没有改变,我希望每次调用它时它都会做同样的事情。这里面有魔法吗 更新

使用2.7.6和0.3

这是我写的一个函数,用来创建一个数据集来训练我的神经网络

这是一个非常复杂的问题,我希望其中75%是培训数据,25%是测试数据(我相信这是一个可以接受的合理划分):

现在,我使用相同的数据调用了该函数两次,如下所示(由于表名和列名有点敏感,所以查询被掩盖了,对不起):

查看输出,我得到以下结果(实际上,每次运行它时,它都会发生变化):

这让我很困惑——为什么每次都会以不同的方式分割数据

由于数据集顺序没有改变,我希望每次调用它时它都会做同样的事情。这里面有魔法吗


更新

下面是另一个更简单的示例:

from pybrain import datasets

d = datasets.SequentialDataSet(0, 1)
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])

for _ in range(2):
    test, train = d.splitWithProportion(0.25)
    print str(len(test)) + " " + str(len(train))
我有时会得到输出

5 18
6 17

似乎每次调用
splitWithProportion
时,它都可以对集合进行不同的取整,因此我猜它一定是对序列进行了随机化,或者可能是其他什么-正如您所看到的,我没有调整数据。我不明白为什么需要这样做。

我相信你的问题与你如何创建新序列有关

        if current_id != last_id:
        count += 1
        ds.newSequence()
我已经验证过,每次调用“618”时,下面的结果都是一致的

from pybrain import datasets

d = datasets.SequentialDataSet(0, 1)
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
test, train = d.splitWithProportion(0.25)
print str(len(test)) + " " + str(len(train))
编辑:
使用SequentialDataSet需要记住的是,分割是沿着序列进行的,而不是单个样本。因此,对于4个序列,0.25的分割将给出1个测试序列和3个训练序列。如果序列的长度不同,那么测试和训练的len()结果就会不同。对于顺序数据集,一切都按预期进行。

谢谢您的回答。不过,您的序列大小都相同(每个序列6个)。如果你稍微改变一下,你也会看到这种现象。我在我的问题中添加了你的代码的一个版本作为示例,这样你就可以看到我澄清了答案,现在对你来说应该是有意义的。谢谢-我知道在一组4个序列中,我会得到1个测试和3个训练,当然,由于四舍五入,如果集合不能被4整除,我希望在这两个集合中只有整数个序列,但我想问的问题是,尽管我猜很糟糕(对不起)这就是为什么拆分数据集中的序列不一致——请注意,我只是在完全相同的数据集上两次调用SplitWithPiration,但是两个结果集的大小不同。我想一定有一些随机性,但我不明白为什么需要它。因为它正在分割序列。如果你有4个序列,其中3个序列有4个项目,一个序列有3个项目。您的物品总数为15件。现在,当你以0.25的比例分割时,你会得到3个训练序列和1个测试序列。随机部分进入序列中,如果选择测试的序列是包含3个项目的序列,则最终将包含12个培训项目和3个测试项目。如果选择的测试序列是4个项目序列中的一个,那么您将有11个项目用于培训,4个项目用于测试。希望澄清。太好了,谢谢,所以你证实了我的怀疑,这是随机的。然而,我的问题是,为什么随机选择用于测试和训练的序列?这在机器学习中常见吗?我希望如果我希望它是随机的,我会在数据集上调用randomize,但它在我调用split函数时对我进行了随机化,这就是我要问的——为什么它对我这样做?(我想我应该学会更清楚地问问题!谢谢你一直支持我)
5 18
6 17
        if current_id != last_id:
        count += 1
        ds.newSequence()
from pybrain import datasets

d = datasets.SequentialDataSet(0, 1)
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.newSequence()
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
d.addSample([],[0])
d.addSample([],[1])
test, train = d.splitWithProportion(0.25)
print str(len(test)) + " " + str(len(train))