2016-07-27 90 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] 

现在,指数之前的对象是培训的对象和之后都测试对象。

相关问题