2013-07-01 10 views
23

Ho un set di dati di grandi dimensioni e voglio dividerlo in allenamento (50%) e set di test (50%).Come suddividere i dati in un convoglio e testarli casualmente?

Suppongo di avere 100 esempi memorizzati nel file di input, ogni riga contiene un esempio. Devo scegliere 50 linee come set di allenamento e set di test di 50 linee.

La mia idea è prima di generare un elenco casuale con lunghezza 100 (i valori vanno da 1 a 100), quindi utilizzare i primi 50 elementi come numero di riga per i 50 esempi di allenamento. Lo stesso con il set di test.

Questo potrebbe essere facilmente raggiunto in 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 

Ma come ho potuto realizzare questa funzione in Python? Sono nuovo di Python e non so se posso leggere l'intero file in un array e scegliere determinate righe.

risposta

46

Questo può essere fatto in modo simile in Python usando gli elenchi, (nota che l'intera lista è mescolata sul posto).

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:] 
+1

bella soluzione. Ma cosa succede se non conosco la quantità di dati nel mio file che forse i nostri dati potrebbero contenere qualche milione di osservazioni e ho bisogno di campionare i dati in set di dati dell'85% e del 15%? –

+4

@ desmond.carros diano un'occhiata al 'da sklearn.cross_validation importazione train_test_split' Quindi fare in questo modo:' X_fit, X_eval, y_fit, y_eval = train_test_split ( treno, destinazione, test_size = 0,15, random_state = 1 ) ' – Rocketq

+0

Per me, mostra" TipoErrore: tipo non smontabile "... – munmunbb

0

Prima di tutto non c'è alcuna cosa come "array" in Python, Python usa elenchi e che fa la differenza, vi suggerisco di utilizzare NumPy che è una buona libreria per Python e si aggiunge un sacco di Funzionalità simile a Matlab. Puoi iniziare qui Numpy for Matlab users

+0

Oh, a proposito del ** ** NumPy funzione ** genfromtxt() ** è molto utile in questi casi. – aehs29

2

Quanto segue produce divisioni di cross-validation più generali di k-fold. Il tuo 50-50 partizionamento sarebbe stato raggiunto facendo k=2 qui sotto, tutto quello che dovrai fare è scegliere una delle due partizioni prodotte. Nota: non ho testato il codice, ma sono abbastanza sicuro che dovrebbe funzionare.

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  
3

Si può anche usare numpy. Quando i dati vengono memorizzati in 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) 
0

si può provare questo approccio

import pandas 
import sklearn 
csv = pandas.read_csv('data.csv') 
train, test = sklearn.cross_validation.train_test_split(csv, train_size = 0.5) 
9
from sklearn.cross_validation 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) 
3

Per rispondere @ desmond.carros domanda, ho modificato la migliore risposta come segue,

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 

il codice divide l'intero set di dati di dati di test del treno e il 20% 80%

2

sklearn.cross_validation è deprecato dalla versione 0.18, invece si dovrebbe usare sklearn.model_selection come mostrato di seguito

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) 
Problemi correlati