2013-07-01 6 views
23

Ich habe einen großen Datensatz und möchte ihn in Training (50%) und Testset (50%) aufteilen.Wie werden Daten zufällig in Trainset und Testset aufgeteilt?

Angenommen, ich habe 100 Beispiele gespeichert die Eingabedatei, jede Zeile enthält ein Beispiel. Ich muss 50 Linien als Trainingssatz und 50 Linien Testset wählen.

Meine Idee ist zuerst eine zufällige Liste mit der Länge 100 (Werte reichen von 1 bis 100), dann verwenden Sie die ersten 50 Elemente als die Zeilennummer für die 50 Trainingsbeispiele. Das gleiche gilt für das Testset.

leicht in Matlab werden Dies könnte

erreicht
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 

Aber wie konnte ich diese Funktion in Python erreichen? Ich bin neu in Python und weiß nicht, ob ich die ganze Datei in ein Array lesen und bestimmte Zeilen auswählen könnte.

Antwort

46

Dies kann in Python ähnlich mit Listen durchgeführt werden (beachten Sie, dass die gesamte Liste an Ort und Stelle gemischt ist).

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

nette Lösung. Was aber, wenn ich nicht weiß, wie viele Daten in meiner Datei enthalten sind, dass unsere Daten möglicherweise einige Millionen Beobachtungen enthalten und ich die Daten in 85% - und 15% -Datensätzen abfragen muss? –

+4

@ desmond.carros einen Blick auf 'von sklearn.cross_validation Import train_test_split' es auf diese Weise also tun: ' X_fit, X_eval, y_fit, y_eval = train_test_split ( Zug, Ziel, test_size = 0,15, random_state = 1 ) ' – Rocketq

+0

Für mich zeigt es" TypeError: unhashable type "... – munmunbb

0

Nun zunächst einmal gibt es nicht so etwas wie „Arrays“ in Python, Python-Listen verwendet und das macht einen Unterschied machen, empfehle ich Ihnen NumPy verwenden, die eine ziemlich gute Bibliothek für Python ist und es fügt eine Menge von Matlab-ähnliche Funktionalität. Sie können hier beginnen Numpy for Matlab users

+0

Ach übrigens den ** ** NumPy Funktion ** genfromtxt() verwenden ** ist in diesen Fällen sehr nützlich. – aehs29

2

Im Folgenden werden generelle k-fache Kreuzvalidierungs-Splits erzeugt. Ihre 50-50-Partitionierung wird erreicht, indem Sie unten k=2 machen. Sie müssen lediglich eine der beiden erstellten Partitionen auswählen. Hinweis: Ich habe den Code nicht getestet, aber ich bin mir ziemlich sicher, dass es funktionieren sollte.

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

Sie könnten auch numpy verwenden. Wenn Sie Ihre Daten in einem numpy.ndarray gespeichert ist:

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

Sie versuchen, diesen Ansatz können

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

@ desmond.carros Frage zu beantworten, modifizierte ich die beste Antwort wie folgt,

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 

Der Code teilt den gesamten Datensatz zu 80% und 20% der Bahn Testdaten

2

sklearn.cross_validation seit Version 0.18 ist veraltet, stattdessen sollten Sie sklearn.model_selection wie unten gezeigt

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) 
Verwandte Themen