2017-08-25 1 views
0

Ich arbeite an einer Klassifizierungsaufgabe und meine Trainingsdatei ist ein csv mit etwa 8 GB (aporx 7,2 Millionen Zeilen und 212 Spalten). Zunächst war mein Ansatz, all diese CSV-Datei zu setzen in einem Pandas-Datenframe und benutze es dann als mehrdimensionales Array, um meinen naiven Bayes-Klassifikator zu trainieren, aber als ich versuchte, die Daten anzupassen, bekam ich eine memory error (Ich arbeite an einer Maschine mit 8GB Ram und einer 64 Bit Version von Python) .Speicherfehler beim Versuch, einen Klassifikator zu passen

Danach habe ich versucht, meine dataframe in 5 Teile zu teilen und verwenden Sie die partia_fit() Methode, aber ich habe immer noch nicht genügend Arbeitsspeicher.

Dies ist mein Code so weit (die Zielwerte sind aus anderen txt-Datei extrahiert):

from csv import DictReader 
from sklearn.naive_bayes import MultinomialNB 
import numpy 
from pandas import* 


target_values_train = [] 

with open('train.txt') as f: 
    reader = DictReader(f, delimiter='\t') 
    for row in reader: 
     target_values_train.append(int(row['human-generated'])) 

y_train = numpy.asarray(target_values_train) 
y_train = y_train[:, numpy.newaxis] 

tp = read_csv('train-indices.csv', iterator=True, chunksize=1000, delimiter=';', skiprows=1) 
df_train = concat(tp, ignore_index=True) 
del df_train['id'] 
print(df_train) 
print(df_train.shape) 
print(y_train.shape) 
df1, df2, df3, df4 = np.array_split(df_train, 5) 
y1, y2, y3, y4, y5=np.array_split(y_train, 5) 
print(df1.shape) 
print(df2.shape) 
print(df3.shape) 


clf = MultinomialNB() 
clf.partial_fit(df1, y1) 
clf.partial_fit(df2, y2) 
clf.partial_fit(df3, y3) 
clf.partial_fit(df4, y4) 
clf.partial_fit(df5, y5) 

Jeder Vorschlag ist sehr willkommen.

+0

Warum nicht alles in eine Schleife legen und nur die erforderlichen Zeilen für jede partielle_Form speichern und lesen? –

+0

Müssen Sie wirklich auf all diesen Daten trainieren? Wenn Daten homogen sind, können Sie auf Seiten von Daten trainieren, die in den Speicher passen und eine gute Punktzahl erzielen. Versuch es. Wenn es nicht ausreicht, können Sie Trainingsdaten in allen Teilen trainieren und vorhersagen, dann Vorhersagen einfach vorhersagen und noch bessere Ergebnisse erzielen. – CrazyElf

+0

Und Sie können versuchen, nicht benötigte Daten sofort nach der Verwendung zu löschen. – CrazyElf

Antwort

0

Mit pd.concat laden Sie alle Daten noch einmal in den Speicher, das entspricht dem Laden der Datei auf einmal.

Sie müssen trainieren, indem Sie nacheinander über die Chunks iterieren. Zum Beispiel würden Sie Folgendes tun:

tp = read_csv('training_data.csv', iterator=True, chunksize=1000, delimiter=';', skiprows=1) 
clf = MultinomialNB() 
for chunk in tp: 
    clf.partial_fit(chunk[["train_col1", "train_col1",...]], chunk["y1"]) 
Verwandte Themen