2016-07-27 25 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-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アイテムのセットでは、1つのアイテムで大きな違いが生じないと想定していたと思います。それが問題であれば、私はラインを追加します。 i - = randint(0,1) ランダムには.7より若干小さいか少し上になるように – James

+1

ループを後で編集するように編集しました。 3 .7を知るための最初の.3を見つける必要があるだけであることを認識すると、.3はより速くなります - それは時間を節約し、なぜ私はそれをもともと考えなかったのか分かりません – James

0

私はPythonに特定の機能があるかどうかわかりませんが、そうではないと仮定すると、ここにアプローチがあります。

シャッフルオブジェクト:

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

辞書値の計算割合:

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

今すぐ、インデックスの前のオブジェクトは、オブジェクトを訓練し、それの後にされている。

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

は、ループを適用しますオブジェクトをテストする。

関連する問題