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.
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:]
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)
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)
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)
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
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
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
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)
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):]