2017-03-13 9 views
0

データセットをトレーニング、検証、テストセットに分割する比率がある場合、これをPythonで行う最も正統的でエレガントな方法は何ですか?Pythonでマトリックスとリストを分割する最も正統な方法

たとえば、データを60%のトレーニング、20%のテスト、および20%の検証に分割しました。私は、それぞれ10個の特徴を持つ1000行のデータと、サイズ1000のラベルベクトルを持っています。トレーニングセットマトリックスは、サイズ(600,10)などでなければなりません。

フィーチャとラベルのリストを新しく作成すると、メモリ効率は良くないでしょうか?私はこのような何かをしたと言うことができます:

TRAIN_PORTION = int(datasetSize * tr) 
VALIDATION_PORTION = int(datasetSize * va) 

# Whatever is left will be for testing 
TEST_PORTION = datasetSize - TRAIN_PORTION - VALIDATION_PORTION 
trainingSet = dataSet[0, TRAIN_PORTION:] 
validationSet = dataSet[TRAIN_PORTION, 
        TRAIN_PORTION + VALIDATIONPORTION:] 
testSet = dataset[TRAIN_PORTION+VALIATION_PORTION, datasetSize:] 

それは私に使用メモリの倍の量を残すでしょうか?

Pythonの構文が正しくないと申し訳ありません。何か助けていただきありがとうございます。

+0

はい、あなたが行ったことは使用メモリの量を倍増させますが、あなたの行列が '(1000,10)のみであるなら、大きな問題にはならないと思います。あなたは記憶の問題にぶつかったのですか? – mitoRibo

+0

まあまあまあまあです。しかし、私は最終的に、私がPythonを使う方法を学んだので、それぞれ約100,000のエントリとおそらく100のフィーチャを持つデータセットを使用することを知っています –

答えて

2

これは間違いありません。あなたはそのようにメモリ使用量を2倍にします。

  • 次のメモリを作成する前に、あるサブマトリクスからメモリを解放してください。メモリを2倍にする必要はありません。メモリの最高水準点を主なマトリックスの1.6倍に減らします。
  • 処理ルーチンを適切な行に停止し、常に元のマトリックスで作業するように記述します。あなたは、スライスを参照するとき

    、覚えておいて、通訳:

あなたの処理ルーチンにリストスライスを渡すことにより、最初の1、など

model_test([TRAIN_PORTION]がdata_set)を達成することができます与えられた制限から生じる一時的なオブジェクトを構築します。 OPのCOMMENT

私があなたに与えた参照TO


応答は、新しいリストを作成しません。より多くのメモリを使用しないようにするには、あなただけのリストのスライスでこれを行うにしたい場合は、あなたが問題を抱えている場所は、説明してくださいなど

process_function(data_set, 0, TRAIN_PORTION) 
process_function(data_set, TRAIN_PORTION, 
          TRAIN_PORTION + VALIDATION_PORTION) 
process_function(data_set, 
       TRAIN_PORTION + VALIDATION_PORTION, 
       len(data_set)) 

全体リストと所望の限度を、渡し、そしてなぜさまざまなドキュメントやチュートリアルがあなたのニーズを満足させていません。

+0

あなたの返事ありがとう!だから私が正しく理解しているのは、新しい行列やリストを作成せず、代わりに正しい索引付けで渡すことです。あなたは他の2つのセットで私を助けてもらえますか?つまり、訓練の部分に書いたように、検証とテストの部分のdata_set []をどのように渡すのですか?ありがとうございました! –

+0

編集のあなたの応答は完璧です、再びあなたをタンク。どんなドキュメンテーションでもこの情報を見つけるのは苦労しました。 –

1

numpy配列を使用する場合(コードは実際にそのように見えます)、ビュー(メモリは共有)を使用することができます。どの操作がビューに表示されるのか、表示されないのかを理解することは必ずしも容易ではありません。 Here are some hints

ショート例:

import numpy as np 

a = np.random.normal(size=(1000, 10)) 
b = a[:600] 
print (b.flags['OWNDATA']) 
# False 

print(b[3,2]) 
# 0.373994992467 (some random-val) 

a[3,2] = 88888888 

print(b[3,2]) 
# 88888888.0 

print(a.shape) 
# (1000, 10) 
print(b.shape) 
# (600, 10) 

は、これはおそらく、テスト、ヴァル、あなたが最初にいくつかのインプレースシャッフルを行い、その後、列車の意見を得るために、あなたのデータのものを線形・セグメントを使用することができます。

関連する問題