web-dev-qa-db-fra.com

Comment diviser les données en train et en test au hasard?

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.

31
Freya Ren

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:]
58
ijmarshall
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)
18
shubhranshu

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)
7
JLT

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)
6
Andrew

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.

4
subin sahayam

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      
2
Lord Henry Wotton

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)
1
Roman Gherta

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

0
aehs29

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

0
lee