1

使用Python 2.7.6 和Pybrain 0.3...

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

这是一个顺序数据集,我希望其中 75% 是训练数据,25% 是测试数据(我相信这是一个公认的合理分割):

from pybrain.datasets import SequentialDataSet

def create_data_sets(rows):

    ds = SequentialDataSet(13, 1)
    last_id = -1
    count = 0

    for row in rows:

        current_id = int(row[14])
        if current_id != last_id:
            count += 1
            ds.newSequence()
        last_id = current_id

        ds.appendLinked(
            [int(row[0]) / 10000.0, 
             int(row[1]) / 10000.0, 
             int(row[2]) / 20.0, 
             int(row[3]) / 9.0, 
             int(row[4]) / 9.0, 
             int(row[5]) / 6.0, 
             int(row[6]) / 6.0,
             float(row[7]), 
             float(row[8]), 
             float(row[9]), 
             float(row[10]), 
             int(row[11]) / 6.0,
             int(row[12]) / 6.0], 
             [float(row[13])])

    test_data, train_data = ds.splitWithProportion(0.25)        
    return (test_data, train_data, count)

现在我调用该函数两次,使用相同的数据(掩盖了查询,因为表名和列名有点敏感,抱歉):

import sqlite3

connection = sqlite3.connect('database.sqlite')
cursor = connection.cursor()
cursor.execute('select A,B,C,D,E,F,G,H,I,J,K,L,M,N,O from P order by O,A')
rows = cursor.fetchall()
connection.close()

test_data, train_data, count = create_data_sets(rows)   
print str(len(test_data)) + " " + str(len(train_data)) + " " + str(count)

test_data, train_data, count = create_data_sets(rows)   
print str(len(test_data)) + " " + str(len(train_data)) + " " + str(count)

查看输出我得到了这个(实际上,每次我运行它时,它都会改变):

400 1222 203
386 1236 203

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

由于数据集顺序没有改变,我希望每次调用它时它都会做同样的事情。这里面是不是发生了什么神奇的事情?


更新

这是另一个更简单的示例:

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调用它都可以以不同的方式对集合进行舍入,所以我猜它可能必须随机化序列或其他东西 - 正如你所看到的,我没有调整数据。我很困惑为什么它需要这样做。

4

1 回答 1

0

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

        if current_id != last_id:
        count += 1
        ds.newSequence()

我已经验证以下每次调用时都会返回一致的“6 18”结果。

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() 结果进行测试和训练。对于顺序数据集,一切都按预期工作。

于 2014-03-04T02:42:51.033 回答