Comment diviser les données en trainset et testset au hasard?

j'ai un grand ensemble de données et je veux le diviser en formation(50%) et jeu de test(50%).

disons que j'ai 100 exemples stockés le fichier d'entrée, chaque ligne contient un exemple. Je dois choisir 50 lignes pour l'entraînement et 50 lignes pour les tests.

mon idée est d'abord de générer une liste aléatoire avec une longueur de 100 (valeurs allant de 1 à 100), puis d'utiliser les 50 premiers éléments comme numéro de ligne pour les 50 exemples de formation. La même chose avec le jeu de test.

Cela pourrait être facilement atteint en 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

Mais comment pourrais-je accomplir cette fonction en Python? Je suis nouveau en Python, et je ne sais pas si je pourrais lire tout le fichier dans un tableau, et choisir certaines lignes.

25
demandé sur Freya Ren 2013-07-01 23:44:33

9 réponses

ceci peut être fait de la même manière en Python en utilisant des listes, (notez que toute la liste est mélangée en place).

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:]
50
répondu ijmarshall 2013-07-01 20:44:15
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)
12
répondu shubhranshu 2018-09-23 16:59:11

Vous pouvez aussi utiliser numpy. Lorsque vos données sont stockées dans un 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)
6
répondu JLT 2016-05-06 09:45:43

sklearn.cross_validation est déprécié depuis la version 0.18, à la place vous devriez utiliser sklearn.model_selection comme indiqué ci-dessous

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)
6
répondu Andrew 2017-10-18 02:06:45

pour répondre À @desmond.carros question, j'ai modifié la meilleure réponse comme suit,

 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

le code divise l'ensemble de données en 80% de données train et 20% de données test

4
répondu subin sahayam 2017-02-06 06:00:52

ce qui suit produit des séparations croisées de validation plus générales du facteur K. Votre partitionnement 50-50 serait réalisé en faisant k=2 ci-dessous, tout ce que vous avez à faire est de choisir une des deux partitions produites. Note: je n'ai pas testé le code, mais je suis presque sûr que ça devrait marcher.

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      
2
répondu Lord Henry Wotton 2016-12-07 23:55:15

tout D'abord, il n'y a pas de "tableaux" en Python, Python utilise des listes et cela fait une différence, je vous suggère d'utiliser num Py qui est une très bonne bibliothèque pour Python et il ajoute beaucoup de Matlab comme fonctionnalité.Vous pouvez commencer ici Numpy pour les utilisateurs de Matlab

0
répondu aehs29 2015-09-04 10:05:20

Vous pouvez essayer cette approche

import pandas
import sklearn
csv = pandas.read_csv('data.csv')
train, test = sklearn.cross_validation.train_test_split(csv, train_size = 0.5)
0
répondu Roman Gherta 2016-09-04 16:19:45

Une petite note pour la réponse de @subin 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

si la taille de votre liste est un nombre pair, vous ne devriez pas ajouter le 1 dans le code ci-dessous. À la place, vous devez d'abord vérifier la taille de la liste et ensuite déterminer si vous avez besoin d'ajouter le 1.

test_data = data [int (Len (data)*.80+1):]

0
répondu lee 2018-07-24 14:44:09