2013-03-15 109 views
0
分離的最佳方式

訓練集由一組樣本和一組標籤組成,每個樣本一組。在我的例子中,樣本是一個向量,而標籤是標量。爲了處理這個問題,我使用了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]]) 

這是對我的情況下,最快的解決方案?還是有更好的?例如創建配對?

+1

你確定分裂你的數據是瓶頸嗎?不,也許,訓練模型? – ziggystar 2013-03-15 21:07:51

回答

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) 

每當你需要新的拆分

0

沒有numpy,也許它不是那麼快。你可以嘗試導入只是「隨機」的「_random」intead以獲得更好的洗牌性能。

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)