2016-07-27 5 views
1

나는 약 3000 개의 개체가 있으며 각 개체에는 그 개체와 관련된 개수가 있습니다. 무작위로 70 % 훈련 및 30 % 테스트 분할로 훈련 및 테스트 데이터에서 이러한 개체를 나누고 싶습니다. 그러나 개체 수와 관계없이 각 개체와 관련된 개수를 기준으로 나누고 싶습니다.무작위로 훈련 및 테스트 데이터를 나누기

예를 들어, 내 데이터 집합에 5 개의 개체가 있다고 가정합니다. 나는 거의 70 % -30 %의 비율로 분할하는 경우

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

, 내 트레이닝 세트는

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

내 테스트 세트가 될 수 있어야

Obj 1 => 200

나는 경우, 다시 나누면, 나는 70-30 분할 비율에 근접한 다른 훈련과 테스트 세트를 얻어야한다. 나는 위의 분할이 나에게 70-30 분할을 제공하지 않는다는 것을 이해하지만 그것이 가까워지면 수용 할 만하다.

파이썬에서이를 수행 할 수있는 미리 정의 된 메소드/패키지가 있습니까? 내가 제대로 질문을 이해 가정

+0

[Numpy : 교차 검증과 같은 방법으로 데이터 집합 (배열)을 학습 및 테스트 데이터 집합으로 분할/분할하는 방법] (http://stackoverflow.com/questions/3674409/numpy-how-to) -split-partition-a-dataset-array-to-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 개의 아이템 세트에서 하나의 아이템이 큰 차이를 내지 않을 것이라고 생각했다.그게 문제라면, 줄을 덧붙여서 i - = randint (0,1) 을 무작위로 .7보다 조금 낮거나 조금 더 높게 – James

+1

나중에 루프를 끝내기 위해 편집했습니다. 3, .7을 알기 위해 .3을 알아야 할 필요가 있다는 것을 깨닫고, .3는 더 빠릅니다. 시간을 절약 할 수 있습니다. 왜 원래 생각하지 않았는지 확실하지 않습니다. – James

0

파이썬에는 특정 기능이 있는지 모르겠지만 여기에는 접근법이 없다고 가정합니다.

셔플 제품 : 사전 값의

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] 

는 인덱스의 전의 객체는 객체를 훈련하고 있습니다 후된다 개체를 테스트합니다.