J'ai un grand ensemble de données et je souhaite le scinder en formation (50%) et en test (50%).
Disons que j'ai 100 exemples stockés dans le fichier d'entrée, chaque ligne contient un exemple. Je dois choisir 50 lignes comme set d'apprentissage et 50 lignes de test.
Mon idée est d’abord de générer une liste aléatoire de longueur 100 (les valeurs vont de 1 à 100), puis d’utiliser les 50 premiers éléments comme numéro de ligne pour les 50 exemples d’entraînement. La même chose avec l'ensemble de test.
Ceci pourrait être réalisé facilement dans 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 connais Python pour la première fois et je ne sais pas si je pourrais lire le fichier entier dans un tableau et choisir certaines lignes.
Cela peut être fait de manière similaire en Python en utilisant des listes (notez que toute la liste est mélangée à la 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 obsolète depuis la version 0.18, vous devriez plutôt 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 à la question @ desmond.carros, 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 de train et 20% de données de test.
Ce qui suit produit des fractionnements plus généraux de validation croisée des k-fold. Votre partitionnement 50-50 serait réalisé en faisant k=2
ci-dessous, tout ce que vous auriez à faire serait de choisir l'une des deux partitions produites. Remarque: je n'ai pas testé le code, mais je suis à peu près sûr que cela devrait fonctionner.
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
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)
Tout d’abord, il n’existe pas de "tableaux" en Python, Python utilise des listes et cela fait une différence, je vous suggère d’utiliser NumPy qui est une très bonne bibliothèque pour Python et qui ajoute beaucoup de matlab comme la fonctionnalité.Vous pouvez commencer ici Numpy pour les utilisateurs de Matlab
Un petit mot 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 devez pas ajouter le 1 dans le code ci-dessous. Au lieu de cela, vous devez d'abord vérifier la taille de la liste, puis déterminer si vous devez ajouter le 1.
test_data = data [int (len (data) *. 80 + 1):]