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

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

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:]
Комментарии (3)
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)
Комментарии (2)

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

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)
Комментарии (0)

Ответить @Десмонд.вопрос Карро, я изменил лучший ответ следующим образом:

 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% данных

Комментарии (0)

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

import pandas
import sklearn
csv = pandas.read_csv('data.csv')
train, test = sklearn.cross_validation.train_test_split(csv, train_size = 0.5)
Комментарии (0)

Следующее производит более общие K-кратная кросс-проверка шпагат. Ваш 50-50 разделение может быть достигнуто путем принятия к=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      
Комментарии (0)

Быстрое примечание для ответа от @Шубин sahayam

 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

Если ваш размер списка-это четное число, вы не должны добавить 1 в приведенном ниже коде. Вместо этого, вы должны проверить размер списка, а затем определить, если вы должны добавить 1.

test_data = данные[инт(лен(данные)*.80+1):]

Комментарии (0)

Ну во-первых там's нет такой вещи, как "блоки" в языке Python, Python использует списки и что делает разницу, я предлагаю вам использовать включает это довольно хорошая библиотека для Python, и это добавляет много Матлаб функции.Вы можете начать здесь numpy для пользователей Матлаб

Комментарии (1)