Ich habe das Problem mit der Verarbeitung von Spark-Wide-Datenrahmen (etwa 9000 Spalten und manchmal mehr) getroffen.
Aufgabe:
Also habe ich einen extensiven Frame gemacht und versucht Vector mit VectorAssembler zu erstellen, zwischengespeichert und darauf KMeans trainiert.
Es dauerte etwa 11 Minuten für die Montage und 2 Minuten für KMeans für 7 verschiedene Anzahl von Clustern auf meinem PC im Standalone-Modus für Frame ~ 500x9000. Eine andere Seite dieser Verarbeitung in Pandas (Pivot df und iterieren 7 Cluster) dauert weniger als eine Minute.
Offensichtlich Ich verstehe Overhead und Leistung für Standalone-Modus und Caching und so weiter, aber es ist wirklich entmutigen mich.
Könnte jemand erklären, wie ich diesen Overhead vermeiden kann?
Wie arbeiten Menschen mit einem breiten DF statt mit Vectorasembler und abnehmender Leistung?
Formalere Frage (für Sofortregeln) klingt wie - Wie kann ich diesen Code beschleunigen?
Konfig:
%Vor%Tatsächlich wurde die Lösung in Karte für rdd gefunden.
Vorteile:
Beispielcode: scala-Implementierung .
Die VectorAssembler-Transformationsfunktion verarbeitet alle Spalten und speichert Metadaten zu jeder Spalte zusätzlich zu den Originaldaten. Das kostet Zeit und beansprucht auch RAM.
Um genau zu sagen, wie viel Dinge zugenommen haben, können Sie Ihren Datenrahmen vor und nach der Transformation als Parkettdateien ablegen und vergleichen. Meiner Erfahrung nach kann ein Feature-Vektor, der von Hand oder mit anderen Feature-Extraktionsmethoden im Vergleich zu einem von VectorAssembler gebauten Feature-Vektor erstellt wurde, eine Größenzunahme von 10x verursachen und dies für eine logistische Regression mit nur 10 Parametern. Die Dinge werden viel schlimmer mit einem Datensatz mit so vielen Spalten wie Sie haben.
Einige Vorschläge:
Tags und Links python machine-learning pandas apache-spark pyspark