Python でトレーニング、テスト、クロス検証のサンプルを作成しているときに、デフォルトの方法が次のように表示されます。
1. ヘッダーをスキップした後のデータセットの読み取り 2. トレーニング、テスト、クロス検証のサンプルの作成
import csv
with open('C:/Users/Train/Trainl.csv', 'r') as f1:
next(f1)
reader = csv.reader(f1, delimiter=',')
input_set = []
for row in reader:
input_set.append(row)
import numpy as np
from numpy import genfromtxt
from sklearn import cross_validation
train, intermediate_set = cross_validation.train_test_split(input_set, train_size=0.6, test_size=0.4)
cv, test = cross_validation.train_test_split(intermediate_set, train_size=0.5, test_size=0.5)
私の問題は、numpy 配列に読み込んだ csv ファイルに「A」というフィールドがあり、すべてのサンプリングでこのフィールドを尊重する必要があることです。つまり、「A」の値が似ているすべてのエントリを 1 つのサンプルに入れる必要があります。
Line #|A | B | C | D
1 |1 |
2 |1 |
3 |1 |
4 |1 |
5 |2 |
6 |2 |
7 |2 |
必須:行 1、2、3、4 を「1 つの」サンプルに入れ、5、6、7 を「1 つの」サンプルに入れる必要があります。 列 A の値は、1 つのエンティティに対応する一意の ID です(1 人のユーザーのクロス セクション データ ポイントと見なされる可能性があるため、train、test、または cv の 1 つの一意のサンプルに含まれる必要があります)。そのため、エンティティ ID によるグループ化が必要です。
B、C、D 列には任意の値を指定できますが、グループ化の保持は必要ありません。(おまけ: 複数のフィールドのサンプリングをグループ化できますか?)
私が試したこと:
A. Aのすべての一意の値を見つける- これを私のサンプルとして示すと、サンプルを st train、intermediate & cv & test の間で配布します -> 次に、これらのファイルのそれぞれに "A" のこの値の残りの行を入れます. つまり、train に "3" のエントリ、"2" のテスト、および "1" の cv がある場合、A の値が 3 のすべての行がトレインに入り、2 のすべてがテストに入り、1 のすべてが cv に入ります。
- もちろん、このアプローチはスケーラブルではありません。
- そして、列 A の 1 の数、2 の数などは等しくないため、データセットに偏りが生じた可能性があります。つまり、このアプローチは機能しません。
B.ここのスレッドに従って、numpy.random.shuffle または numpy.random.permutationも試しました - Numpy: How to split/partition a dataset (array) into training and test datasets for, eg cross validation? 、しかし、それは私の要件を満たしていませんでした。
C.もちろん、3番目のオプションは、このグループ化を行うカスタム関数を作成し、各グループのデータポイントの数に基づいてトレーニング、テスト、および cv データセットのバランスをとることです。しかし、これを実装する効率的な方法が既にあるかどうか疑問に思っていますか?
私のデータセットは巨大であるため、理想的には、分割が正しいことを確認するために複数の眼球スキャンを行わずに、データセットを分割する決定論的な方法が必要です。
編集パート2:
サンプリング基準に適合するものが見つからなかったので、グループ化の制約を使用してサンプリングするモジュールを実際に作成しました。これはそのgithub コードです。このコードは非常に大きなデータを想定して書かれていないため、あまり効率的ではありません。このコードをフォークする必要がある場合は、実行時間を改善する方法を指摘してください。 https://github.com/ekta1007/Sampling-techniques/blob/master/sample_expedia.py