表示训练集分裂的最佳方式

时间:2013-03-15 15:52:41

标签: python arrays numpy artificial-intelligence

训练集由一组样本和一组标签组成,每个样本一个。在我的例子中,样本是向量,而标签是标量。为了解决这个问题,我使用了Numpy。考虑这个例子:

samples = np.array([[1,0],[0.2,0.5], [0.3,0.8]])
labels = np.array([1,0,0])

现在我必须将训练集分成两个分区,这些分区将元素混乱。这个事实引发了一个问题:我放弃了与标签的对应关系。我该如何解决这个问题?

由于性能在我的项目中至关重要,我不想构建置换向量,我正在寻找一种方法将标签与样本绑定。到目前为止,我的解决方案是使用样本数组的最后一列作为标签,如:

samples_and_labels = np.array([[1,0,0],[0.2,0.5,0], [0.3,0.8,1]])

这是我案例中最快的解决方案吗?还是有更好的?例如创建对?

2 个答案:

答案 0 :(得分:1)

使用float数据类型混合索引让我感到不安。当你说分开训练集时,这是完全随机的吗?如果是这样的话,我会选择随机排列向量 - 我认为你的解决方案没有更快(即使没有我的数据类型保留),因为你在创建samples_and_labels数组时仍然在分配内存。

你可以这样做(假设len(samples)即使是为了简化说明):

# set n to len(samples)/2
ind = np.hstack((np.ones(n, dtype=np.bool), np.zeros(n, dtype=np.bool)))
# modifies in-place, no memory allocation
np.random.shuffle(ind)

然后你可以做

samples_left, samples_right = samples[ind], samples[ind == False]
labels_left, labels_right = labels[ind], labels[ind == False]

并致电

np.random.shuffle(ind)

每当您需要新的拆分时

答案 1 :(得分:0)

没有numpy,也许它不是那么快。您可以尝试导入“随机”而不是“随机”以获得更好的改组性能。

import random

samples = [[1,0],[0.2,0.5], [0.3,0.8]]
labels = [1,0,0]

print(samples, '\n', labels)

z = list(zip(samples, labels))
random.shuffle(z)

samples, labels = zip(*z)

print(samples, '\n', labels)