Как распределять данные в поездах и наборы тестов случайным образом?
У меня есть большой набор данных и вы хотите разделить его на обучение (50%) и набор тестов (50%).
Скажем, у меня есть 100 примеров, которые хранят входной файл, каждая строка содержит один пример. Мне нужно выбрать 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 и не знаю, могу ли я прочитать весь файл в массиве и выбрать определенные строки.
Ответы
Ответ 1
Это можно сделать аналогично в 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:]
Ответ 2
from sklearn.cross_validation import train_test_split
import numpy
with open("datafile.txt", "rb") as f:
data = f.read().split('\n')
data = numpy.array(data) #convert array to numpy type array
x_train ,x_test = train_test_split(data,test_size=0.5) #test_size=0.5(whole_data)
Ответ 3
Вы также можете использовать 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)
Ответ 4
Чтобы ответить на вопрос @desmond.carros, я изменил наилучший ответ следующим образом:
import random
file=open("datafile.txt","r")
data=list()
for line in file:
data.append(line.split(#your preferred delimiter))
file.close()
random.shuffle(data)
train_data = data[:int((len(data)+1)*.80)] #Remaining 80% to training set
test_data = data[int(len(data)*.80+1):] #Splits 20% data to test set
Код разбивает весь набор данных на 80% поезда и 20% тестовых данных
Ответ 5
Ниже приводятся более общие k-кратные кросс-валидации. Ваше 50-50 разбиение будет достигнуто, сделав k=2
ниже, все, что вам нужно будет, - выбрать один из двух произведенных разделов. Примечание. Я не тестировал код, но я уверен, что он должен работать.
import random, math
def k_fold(myfile, myseed=11109, k=3):
# Load data
data = open(myfile).readlines()
# Shuffle input
random.seed=myseed
random.shuffle(data)
# Compute partition size given input k
len_part=int(math.ceil(len(data)/float(k)))
# Create one partition per fold
train={}
test={}
for ii in range(k):
test[ii] = data[ii*len_part:ii*len_part+len_part]
train[ii] = [jj for jj in data if jj not in test[ii]]
return train, test
Ответ 6
sklearn.cross_validation
устарел с версии 0.18, вместо этого вы должны использовать sklearn.model_selection
как показано ниже
from sklearn.model_selection import train_test_split
import numpy
with open("datafile.txt", "rb") as f:
data = f.read().split('\n')
data = numpy.array(data) #convert array to numpy type array
x_train ,x_test = train_test_split(data,test_size=0.5) #test_size=0.5(whole_data)
Ответ 7
Ну, в первую очередь, в Python нет такой вещи, как "массивы", Python использует списки, и это действительно имеет значение, я предлагаю вам использовать NumPy, что является довольно хорошей библиотекой для Python, и это добавляет много функций, подобных Matlab. Вы можете начать здесь Numpy для пользователей Matlab
Ответ 8
Вы можете попробовать этот подход
import pandas
import sklearn
csv = pandas.read_csv('data.csv')
train, test = sklearn.cross_validation.train_test_split(csv, train_size = 0.5)