Как распределять данные в поездах и наборы тестов случайным образом?

У меня есть большой набор данных и вы хотите разделить его на тренировки (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 и не знаю, могу ли я прочитать весь файл в массиве и выбрать определенные строки.

  • удаление файла, если оно существует; питон
  • Как написать многомерный массив в текстовый файл?
  • Удаление всех файлов в каталоге с помощью Python
  • Как писать в середине текстового файла при чтении его содержимого?
  • ValueError: операция ввода-вывода в закрытом файле
  • Многопроцессор Python с использованием очереди для записи в один файл
  • IOError при попытке открыть существующие файлы
  • Как заставить считыватель CSV читать файл памяти?
  • 7 Solutions collect form web for “Как распределять данные в поездах и наборы тестов случайным образом?”

    Это можно сделать аналогично в 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:] 
     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) 

    Чтобы ответить на вопрос @ 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% тестовых данных

    Вы также можете использовать 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) 

    Ниже приводятся более общие 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 

    Ну, во-первых, в Python нет такой вещи, как «массивы», Python использует списки, и это действительно имеет значение, я предлагаю вам использовать NumPy, который является довольно хорошей библиотекой для Python, и он добавляет много функций, подобных Matlab. можно начать здесь. Numpy для пользователей Matlab

    Вы можете попробовать этот подход

     import pandas import sklearn csv = pandas.read_csv('data.csv') train, test = sklearn.cross_validation.train_test_split(csv, train_size = 0.5) 
    Python - лучший язык программирования в мире.