Ich habe eine große Datenmenge (ca. 8 GB). Ich möchte maschinelles Lernen nutzen, um es zu analysieren. Daher denke ich, dass ich SVD und dann PCA verwenden sollte, um die Datendimensionalität aus Gründen der Effizienz zu reduzieren. MATLAB und Octave können jedoch einen so großen Datensatz nicht laden.
Mit welchen Tools kann ich SVD mit einer so großen Datenmenge erstellen?
bigdata
data-mining
dimensionality-reduction
David S.
quelle
quelle
Antworten:
Erstens wird die Dimensionsreduktion verwendet, wenn Sie viele kovariierte Dimensionen haben und die Problemgröße reduzieren möchten, indem Sie Datenpunkte auf eine neue orthogonale Basis drehen und nur Achsen mit der größten Varianz nehmen. Mit 8 Variablen (Spalten) ist Ihr Speicherplatz bereits niedrig dimensioniert. Wenn Sie die Anzahl der Variablen weiter verringern, werden technische Probleme mit der Speichergröße wahrscheinlich nicht gelöst, die Datenqualität kann jedoch erheblich beeinträchtigt werden. In Ihrem konkreten Fall ist es vielversprechender, einen Blick auf das Online-Lernen zu werfenMethoden. Anstatt mit dem gesamten Datensatz zu arbeiten, nehmen diese Methoden grob gesagt jeweils einen kleinen Teil von ihnen (oft als "Mini-Batches" bezeichnet) und erstellen inkrementell ein Modell. (Ich persönlich interpretiere das Wort "online" gerne als Hinweis auf eine unendlich lange Datenquelle aus dem Internet wie einen Twitter-Feed, bei dem Sie nicht den gesamten Datensatz auf einmal laden können.)
Aber was ist, wenn Sie wirklich Dimensionalitätsreduzierungstechniken wie PCA auf einen Datensatz anwenden möchten, der nicht in ein Gedächtnis passt? Normalerweise wird ein Datensatz als Datenmatrix X der Größe n x m dargestellt , wobei n die Anzahl der Beobachtungen (Zeilen) und m die Anzahl der Variablen (Spalten) ist. Typischerweise entstehen Speicherprobleme nur durch eine dieser beiden Zahlen.
Zu viele Beobachtungen (n >> m)
Wenn Sie zu viele Beobachtungen haben , die Anzahl der Variablen jedoch zwischen klein und moderat liegt, können Sie die Kovarianzmatrix schrittweise erstellen . Tatsächlich besteht eine typische PCA darin, eine Kovarianzmatrix der Größe m × m zu konstruieren und eine Singularwertzerlegung darauf anzuwenden. Mit m = 1000 Variablen vom Typ float64 hat eine Kovarianzmatrix eine Größe von 1000 * 1000 * 8 ~ 8 MB, die leicht in den Speicher passt und mit SVD verwendet werden kann. Sie müssen also nur die Kovarianzmatrix erstellen, ohne den gesamten Datensatz in den Speicher zu laden - eine ziemlich nachvollziehbare Aufgabe .
Alternativ können Sie eine kleine repräsentative Stichprobe aus Ihrem Datensatz auswählen und die Kovarianzmatrix approximieren . Diese Matrix hat dieselben Eigenschaften wie normal, ist jedoch etwas ungenauer.
Zu viele Variablen (n << m)
Andererseits passt manchmal, wenn Sie zu viele Variablen haben , die Kovarianzmatrix selbst nicht in den Speicher. Wenn Sie beispielsweise mit 640 x 480 Bildern arbeiten, hat jede Beobachtung 640 * 480 = 307200 Variablen, was zu einer 703-GB-Kovarianzmatrix führt! Das ist definitiv nicht das, was Sie im Speicher Ihres Computers oder sogar im Speicher Ihres Clusters behalten möchten. Wir müssen also die Dimensionen reduzieren, ohne überhaupt eine Kovarianzmatrix zu erstellen.
Meine Lieblingsmethode ist die Zufallsprojektion . Kurz gesagt, wenn Sie einen Datensatz X der Größe n x m haben , können Sie ihn mit einer spärlichen Zufallsmatrix R der Größe m x k (mit k << m ) multiplizieren und eine neue Matrix X ' mit einer viel kleineren Größe n x k erhalten mit ungefähr den gleichen Eigenschaften wie die ursprüngliche. Warum funktioniert es? Nun, Sie sollten wissen, dass PCA darauf abzielt, orthogonale Achsen (Hauptkomponenten) zu finden und Ihre Daten auf das erste k zu projizierenvon ihnen. Es zeigt sich, dass spärliche Zufallsvektoren nahezu orthogonal sind und somit auch als neue Basis verwendet werden können.
Und natürlich müssen Sie nicht den gesamten Datensatz X mit R multiplizieren - Sie können jede Beobachtung x einzeln oder in kleinen Mengen in die neue Basis übersetzen .
Es gibt auch einen ähnlichen Algorithmus namens Random SVD . Ich habe keine wirklichen Erfahrungen damit, aber Sie können hier Beispielcode mit Erklärungen finden .
Im Folgenden finden Sie eine kurze Checkliste zur Reduzierung der Dimensionalität großer Datensätze:
quelle
Mach dir keine Sorgen.
Erste Regel der Programmierung - das gilt auch für die Datenwissenschaft: Alles daran setzen, ein kleines Testproblem zu lösen.
Nehmen Sie also eine zufällige Stichprobe Ihrer Daten von beispielsweise 100.000 Zeilen. Probieren Sie verschiedene Algorithmen usw. aus. Wenn Sie alle Funktionen zu Ihrer Zufriedenheit ausgeführt haben, können Sie größere (und größere) Datensätze ausprobieren - und sehen, wie sich der Testfehler verringert, wenn Sie weitere Daten hinzufügen.
Außerdem möchten Sie svd nicht auf nur 8 Spalten anwenden: Sie wenden es an, wenn Sie viele Spalten haben.
quelle
PCA wird normalerweise durch Berechnung der SVD auf der Kovarianzmatrix implementiert.
Das Berechnen der Kovarianzmatrix ist eine peinlich parallele Aufgabe, daher skaliert sie linear mit der Anzahl der Datensätze und lässt sich trivial auf mehrere Computer verteilen!
Überfliegen Sie Ihre Daten nur einmal, um die Mittel zu berechnen. Dann ein zweiter Durchgang, um die Kovarianzmatrix zu berechnen. Dies kann einfach mit Kartenreduzierung durchgeführt werden - im Grunde ist es dasselbe wie das erneute Berechnen der Mittel. Summenbegriffe wie in Kovarianz sind trivial zu parallelisieren! Möglicherweise müssen Sie nur auf Zahlen achten, wenn Sie viele Werte ähnlicher Größe summieren.
Bei einer Vielzahl von Variablen sieht es anders aus . Auf einem 8-GB-System sollte es jedoch möglich sein, PCA mit den BLAS-Bibliotheken auf bis zu 20.000 Dimensionen im Arbeitsspeicher auszuführen. Aber dann könnten Sie auf das Problem stoßen, dass PCA nicht mehr so zuverlässig ist, weil es zu viele Freiheitsgrade hat. Mit anderen Worten: Es passt leicht. Ich habe die Empfehlung gesehen, mindestens 10 * d * d Datensätze zu haben (oder war es d ^ 3). Für 10000 Dimensionen sollten Sie also mindestens eine Milliarde Datensätze (von 10000 Dimensionen ... das ist eine Menge!) Haben, damit das Ergebnis statistisch zuverlässig ist.
quelle
Obwohl Sie wahrscheinlich einige Tools finden, mit denen Sie dies auf einer einzelnen Maschine tun können, befinden Sie sich in einem Bereich, in dem es sinnvoll ist, Tools wie Spark für "große Datenmengen" in Betracht zu ziehen, insbesondere, wenn Sie glauben, dass Ihre Datenmenge zunehmen könnte. Spark hat eine Komponente namens MLlib, die PCA und SVD unterstützt. Die Dokumentation enthält Beispiele .
quelle
Wir haben SVD mit PySpark in einen größeren Datensatz implementiert. Wir haben auch die Konsistenz über verschiedene Pakete hinweg verglichen. Hier ist der Link.
quelle
Ich würde Python empfehlen, wenn Sie die Datei faul auswerten, Sie einen winzigen Speicherbedarf haben und numpy / scipy Ihnen Zugriff auf alle Tools geben würden, die Octave / Matlab verwenden würde.
quelle