Speicher effizienter Weg, um split große numpy-array zu trainieren und zu testen
Ich habe eine große numpy-array und wenn ich laufen scikit lernen ist train_test_split split das array in Trainings-und Testdaten, die ich ausführen immer in den Arbeitsspeicher-Fehler. Was wäre ein mehr-Speicher-effiziente Methode der Aufspaltung in Schulen und zu testen, und warum das train_test_split die das verursachen?
Den Folgen code führt zu einem Arbeitsspeicher-Fehler und verursacht einen Absturz
import numpy as np
from sklearn.cross_validation import train_test_split
X = np.random.random((10000,70000))
Y = np.random.random((10000,))
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.33, random_state=42)
- Dies kann von Interesse sein - numpy-discussion.10968.n7.nabble.com/Huge-arrays-td25254.html
- funktioniert für mich auf einer 64G-Maschine, hatte große Probleme auf eine 8G laptop (hätte wahrscheinlich die led für memory-Fehler, wenn ich das nicht hätte getötet it). Das Problem ist wahrscheinlich, dass die Zug - /test-split unausweichlich Kopien der Daten, denn es nutzt fancy indexing, in der Erwägung, dass in einer situation ohne Randomisierung, z.B. KFold, könnte dies vermieden werden (aber man müsste code, der split sich selbst, weil sklearn ist KFold auch Kopien). Wenn Sie brauchen, Randomisierung, kann man inplace mischen Sie die Daten zuerst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Methode, die ich versucht habe, die funktioniert, ist zum speichern von X in ein pandas dataframe und shuffle
da komme ich auf den gleichen Speicher-Fehler, wenn ich versuche
Dann, ich konvertiere die pandas dataframe zurück in ein numpy-array und verwenden Sie diese Funktion, ich kann erhalten Sie eine Zug-test-split
Dies funktioniert für jetzt, und wenn ich will, zu tun k-fold cross-validation, ich kann iterativ Schleife k-mal und schieben Sie die pandas dataframe. Während das genügt für jetzt, warum numpy und sci-kit lernen Implementierungen shuffle und train_test_split Ergebnis im Speicher Fehler für große arrays?
Stieß ich auf ein ähnliches problem.
Wie erwähnt von @user1879926, ich denke, der shuffle ist eine wesentliche Ursache der Speicher erschöpft.
Und ,wie "Shuffle" wird behauptet, einen ungültigen parameter für model_selection.train_test_split zitiert,
train_test_split in sklearn 0.19 option deaktivieren shuffle.
So, ich denke, man kann die Flucht aus dem Speicher Fehler, indem Sie nur shuffle=False option.
Ich Stand vor dem gleichen problem mit meinem code. Ich war mit einem dichten array wie du und ran out of memory. Ich wandelte meine Trainingsdaten zu spärlich (ich mache Dokument-Klassifikation) und mein Problem gelöst.
Ich nehme an, eine mehr "Speicher effizient" Weg wäre, um iterativ wählen Sie Instanzen für die Ausbildung und Prüfung (obwohl, wie es typisch in der informatik, Sie opfern Effizienz inhärente bei der Verwendung von Matrizen).
Was Sie tun könnten, ist die Iteration über das array und für jeden Beispiel 'flip a coin' (verwenden Sie die random-Paket), um zu bestimmen, ob Sie die Instanz als Ausbildung oder Prüfung und, je nach dem, Speicherung der Instanz in die entsprechenden numpy-array.
Diese iterative Methode sollte nicht schlecht sein, für nur 10000 Instanzen. Was ist merkwürdig ist aber, dass 10000 X 70000 gar nicht so groß, was für einen Rechner verwendest du? Macht mich Frage mich, ob es ein Python/numpy/scikit-Problem oder ein Rechner-Problem...
Anyway, ich hoffe, das hilft!