随机拆分培训和测试数据

时间:2016-07-27 13:42:01

标签: python python-2.7 machine-learning training-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中是否有任何预定义的方法/包来执行此操作?

2 个答案:

答案 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),你不会得到比这更好的时间复杂度。有一些方法可以将循环和诸如此类的东西压缩成一个衬里,但是我不知道有任何内置函数可以完成你用单个函数所要求的内容,尤其是当你要求它在某种意义上是“随机”时每次拆分时你都想要一个不同的训练/测试装置(据我所知)

答案 1 :(得分: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]

现在,index之前的对象是训练对象,之后是测试对象。<​​/ p>