57

大きなデータセットがあり、それをトレーニング (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が初めてで、ファイル全体を配列に読み込んで特定の行を選択できるかどうかわかりません。

4

9 に答える 9

94

これは、リストを使用して Python でも同様に行うことができます (リスト全体が適切にシャッフルされていることに注意してください)。

import random

with open("datafile.txt", "rb") as f:
    data = f.read().split('\n')

random.shuffle(data)

train_data = data[:50]
test_data = data[50:]
于 2013-07-01T20:44:15.190 に答える
9

numpy を使用することもできます。データが numpy.ndarray に格納されている場合:

import numpy as np
from random import sample
l = 100 #length of data 
f = 50  #number of elements you need
indices = sample(range(l),f)

train_data = data[indices]
test_data = np.delete(data,indices)
于 2016-05-06T09:45:43.603 に答える
6

このアプローチを試すことができます

import pandas
import sklearn
csv = pandas.read_csv('data.csv')
train, test = sklearn.cross_validation.train_test_split(csv, train_size = 0.5)

UPDATE :train_test_splitに移動したmodel_selectionため、現在の方法 (scikit-learn 0.22.2) は次のとおりです。

import pandas
import sklearn
csv = pandas.read_csv('data.csv')
train, test = sklearn.model_selection.train_test_split(csv, train_size = 0.5)
于 2016-09-04T16:19:45.057 に答える
-2

まず第一に、Python には「配列」のようなものはありません。Python はリストを使用し、それが違いを生みます。Python 用の非常に優れたライブラリであるNumPyを使用することをお勧めします。これにより、多くの Matlab のような機能が追加されます。ここから始めることができますMatlab ユーザー向けの Numpy

于 2013-07-01T20:03:52.947 に答える