2016-07-27 93 views
1

我有大約3000個對象,其中每個對象都有一個與它相關的計數。我想隨機將這些對象分成70%的培訓和30%的測試分組。但是,我想根據與每個對象關聯的計數來劃分它們,但不是基於對象的數量。隨機分割訓練和測試數據

一個例子,假設我的數據集包含5個對象。

Obj 1 => 200 
Obj 2 => 30 
Obj 3 => 40 
Obj 4 => 20 
Obj 5 => 110 

如果我他們有近70%-30%的比例分成,我的訓練集應該是

Obj 2 => 30 
Obj 3 => 40 
Obj 4 => 20 
Obj 5 => 110 

和我的測試集將

Obj 1 => 200

如果我再分開它們,我應該接近70-30分流比的不同訓練和測試組。我明白上面的分裂並不能給我純粹的70-30分裂,但只要它接近它,這是可以接受的。

是否有任何預定義的方法/包在Python中執行此操作?

+0

[Numpy:如何將數據集(數組)分割/分割爲訓練和測試數據集以進行交叉驗證?](http://stackoverflow.com/questions/3674409/numpy-how-to -split-partition-a-dataset-array-into-training-and-test-datasets) – Zafi

+0

只是爲了記錄,這可能是一個非常糟糕的主意。你通常希望保持你的訓練集相同,這樣你就不會訓練你的測試數據。 –

回答

2

假設我正確地理解你的問題,我的建議是這樣的:

from random import shuffle 
sum = sum([obj.count for obj in obj_list]) #Get the total "count" of all the objects, O(n) 
shuffle(obj_list) 
running_sum = 0 
i = 0 
while running_sum < sum * .3 
    running_sum += obj_list[i].count 
    i += 1 
training_data = obj_list[i:] 
testing_data = obj_list[:i] 

這整個操作是O(n),你不會得到比這更好的時間複雜度。當然,有些方法可以將循環和任何內容壓縮到一個內襯中,但我不知道任何內建函數能夠完成單個函數所要求的內容,特別是當您在某種意義上要求它是「隨機」時你想要每次分割它時都需要一個不同的訓練/測試集(因爲我理解這個問題)

+0

謝謝你的迴應。您已正確理解我的問題。該方法非常優化。我同意爲了得到總和,我必須循環所有對象一次。因此,O(n)。但是,如果running_sum> sum * .7'會使訓練集始終超過70%,我是否正確地做出了這個聲明。 – Veenit

+0

更多的一個單一的項目,你是對的。我想我假設在一組3000件物品上,一件物品不會產生很大的差異。如果這是一個問題,那麼我會添加行 我 - = randint(0,1) ,使它隨機或略低於.7或略高 – James

+1

我也編輯,使循環停止後。 3,意識到你只需要找到第一個.3就可以知道.7,所以到.3更快 - 這會節省一些時間,不知道爲什麼我最初沒有想到這個 – James

0

我不知道Python中是否有特定的函數,但假設沒有,這裏是一種方法。

洗牌對象:字典值的

from random import shuffle 
values = shuffle[200, 40, 30, 110, 20] 

計算百分比:

prob = [float(i)/sum(values) for i in values] 

申請一個循環:

sum=0 
for i in range(len(result)): 
    if sum>0.7: 
     index=i-1 
     break 
    sum=sum+result[i] 

現在,指數之前的對象是培訓的對象和之後都測試對象。

相關問題