2016-04-17 9 views
1

私は12列+1ターゲット(バイナリ)と約4000行のデータセットを持っています。列車(70%)、検証(20%)、テスト(10%)に分割する必要があります。Matlabは列車/有効/テストセットに分割され、比率を維持する

データセットは非常にアンダーサンプリングされているため(クラス0の95%〜クラス1の5%)、各サンプルのターゲットの比率を維持する必要があります。

私は何とかデータセットを分割することができますが、比率をどのように維持するかはわかりません。

私はサブセットワインの品質データ

+0

内蔵の 'crossvalind'関数のドキュメントを見てください。あなたは(例えば)10倍を生成することができ、そのうちの7つをトレーニングに、2つを検証に、そして1つをテストに使用することができます。 –

+0

私はそれを見ました。確かに良いアイデア。しかし、 'crossvalind'は、ターゲットの列に比例しますか? – HonzaB

+0

私は99%あなたがこのオプションを与えることができると確信しています。ドキュメントを見て.. –

答えて

1

あなたはMATLABの統計処理ツールボックスへのアクセス権を持っている場合は、cvpartition 機能を使用することができます。 MATLABヘルプから

cvpartitionオン - :

C = cvpartition(群、「ホールドアウト」、p)をランダムに訓練セットとグループにおけるクラス情報を使用して、層別化とテストセットに観測を仕切ります。つまり、トレーニングセットとテストセットの両方が、グループとほぼ同じクラスの比率を持っています。

この機能を2回適用すると、3つのパーティションを取得できます。この関数は元のクラスの分布を保持します。

0

hereで働いていますがこれまでのところ私は、誰もがよりよい解決策を知っている場合、私に知らせて、これを思い付きました。 データセットをターゲット列で分割した後、それぞれの2つの分割を最初の70%、次の20%、最後の10%のデータに分割して結合しました。 その後、フィーチャーとターゲットを分割しました。

%split in 0/1 samples 
winedataset_0 = winedataset(winedataset(:, 13) == 0, :); 
winedataset_1 = winedataset(winedataset(:, 13) == 1, :); 

%train 
split_tr_0 = round(length(winedataset_0)*0.7); 
split_tr_1 = round(length(winedataset_1)*0.7); 
train_0 = winedataset_0(1:split_tr_0,:); 
train_1 = winedataset_1(1:split_tr_1,:); 
train_set = vertcat(train_0, train_1); 
train_set = train_set(randperm(length(train_set)),:); 

%valid 
split_valid_0 = split_tr_0 + round(length(winedataset_0)*0.2); 
split_valid_1 = split_tr_1 + round(length(winedataset_1)*0.2); 
valid_0 = winedataset_0(split_tr_0+1:split_valid_0,:); 
valid_1 = winedataset_1(split_tr_1+1:split_valid_1,:); 
valid_set = vertcat(valid_0, valid_1); 
valid_set = valid_set(randperm(length(valid_set)),:); 

%test 
test_0 = winedataset_0(split_valid_0+1:end,:); 
test_1 = winedataset_1(split_valid_1+1:end,:); 
test_set = vertcat(test_0, test_1); 
test_set = test_set(randperm(length(test_set)),:); 


%Split into X and y 
X_train = train_set(:,1:12); 
y_train = train_set(:,13); 

X_valid = valid_set(:,1:12); 
y_valid = valid_set(:,13); 

X_test = test_set(:,1:12); 
y_test = test_set(:,13); 
関連する問題