训练集由一组样本和一组标签组成,每个样本一个。在我的例子中,样本是向量,而标签是标量。为了解决这个问题,我使用了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]])
这是我案例中最快的解决方案吗?还是有更好的?例如创建对?
答案 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)