簡體   English   中英

隨機分配訓練和測試數據

[英]Randomly splitting training and testing data

我大約有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中是否有任何預定義的方法/軟件包可以執行此操作?

假設我正確理解了您的問題,我的建議是:

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),您將不會獲得比這更好的時間復雜度。 當然,有多種方法可以將循環和其他內容壓縮到一個內襯中,但是我不知道有任何內置函數可以通過單個函數來完成您所要的內容,尤其是當您要求將其視為“隨機”時您每次拆分時都需要不同的培訓/測試集(據我所知,這個問題)

我不知道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]

現在,索引之前的對象是訓練對象,而索引之后的對象是測試對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM