データをランダムにtrainsetとtestsetに分割するには?
大きなデータセットがあり、それをトレーニングセット(50%)とテストセット(50%)に分けたい。
入力ファイルに100個の例が保存されていて、各行に1個の例が含まれているとする。50行をトレーニングセット、50行をテストセットとして選択する必要がある。
私のアイデアは、まず長さ100(値の範囲は1から100まで)のランダムリストを生成し、最初の50個の要素を50個のトレーニング例の行番号として使用します。テストセットも同様です。
これはMatlabで簡単に実現できる
fid=fopen(datafile);
C = textscan(fid, '%s','delimiter', '\n');
plist=randperm(100);
for i=1:50
trainstring = C{plist(i)};
fprintf(train_file,trainstring);
end
for i=51:100
teststring = C{plist(i)};
fprintf(test_file,teststring);
end
しかし、Pythonでこの機能を実現するにはどうしたらよいでしょうか?Pythonは初めてで、ファイル全体を配列に読み込んで、特定の行を選択できるかどうかわかりません。
39
9
これはPythonでもリストを使って同様にできる(リスト全体がその場でシャッフルされることに注意)。
numpyを使用することもできます。 データがnumpy.ndarrayに保存されている場合:
sklearn.cross_validation
はバージョン0.18以降非推奨です。代わりに、以下の図のようにsklearn.model_selection
を使用する必要があります。@ desmond.carrosの質問に答えるために、私は次のように最良の答えを変更しました。
コードは、データセット全体を80%の列車と20%のテストデータに分割します。
このアプローチを試すことができます。
以下は、より一般的なk-foldクロスバリデーション分割を生成します。あなたの50対50のパーティショニングは、以下の
k=2
にすることで達成されるでしょう。注: このコードをテストしたわけではないが、うまくいくはずである。@subin sahayamからの回答の簡単なメモ。
リストサイズが偶数の場合は、下のコードに1を追加しないでください。 代わりに、最初にリストのサイズを確認し、次に1を追加する必要があるかどうかを判断する必要があります。
Pythonはリストを使うので、その違いはあります。Pythonのためのかなり良いライブラリであるNumPyを使うことをお勧めします。