Zugriffselement eines Vektors in einem Spark DataFrame (logistischer Regressionswahrscheinlichkeitsvektor) [duplizieren]

8

Ich habe ein LogisticRegression-Modell in PySpark trainiert (ML-Paket) und das Ergebnis der Vorhersage ist ein PySpark DataFrame ( cv_predictions ) (siehe [1]). Die probability -Spalte (siehe [2]) ist ein vector -Typ (siehe [3]).

%Vor%

Wie erstelle ich das vector des PySpark DataFrame analysieren, so dass ich eine neue Spalte erstelle, die nur das erste Element jedes probability vectors zieht?

Diese Frage ist ähnlich, aber die Lösungen in den folgenden Links funktionierten nicht / waren mir nicht klar:

Zugriff auf die Werte von doseVector in PySpark

Zugriff auf das Element von eine VectorUDT-Spalte in einem Spark DataFrame?

    
user2205916 08.06.2017, 01:17
quelle

1 Antwort

12

Aktualisierung:

Offenbar gibt es einen Fehler in spark, der den Zugriff auf einzelne Elemente in einem dichten Vektor während einer select-Anweisung verhindert. Normalerweise sollten Sie in der Lage sein, auf sie zuzugreifen, genau wie Sie es bei einem numply-Array tun würden. Wenn Sie jedoch versuchen, den zuvor geposteten Code auszuführen, erhalten Sie möglicherweise den Fehler pyspark.sql.utils.AnalysisException: "Can't extract value from probability#12;"

Eine Möglichkeit, um diesen albernen Bug zu umgehen, ist die Verwendung eines udf. Ähnlich wie bei der anderen Frage können Sie ein udf wie folgt definieren:

%Vor%

Hinter den Kulissen greift dies immer noch auf die Elemente des DenseVectors wie ein numpliges Array zu, aber es wirft nicht den gleichen Fehler wie zuvor.

Ursprüngliche Antwort: Ein dichter Vektor ist nur ein Wrapper für ein numpiges Array. So können Sie auf die Elemente auf die gleiche Weise zugreifen, wie Sie auf die Elemente eines noppenartigen Arrays zugreifen würden.

Es gibt mehrere Möglichkeiten, auf einzelne Elemente eines Arrays in einem Datenrahmen zuzugreifen. Eine besteht darin, die Spalte cv_predictions_prod['probability'] in Ihrer Select-Anweisung explizit aufzurufen. Indem Sie die Spalte explizit aufrufen, können Sie Operationen für diese Spalte ausführen, z. B. das erste Element im Array auswählen. Zum Beispiel:

%Vor%

sollte das Problem lösen.

    
DavidWayne 12.06.2017 17:38
quelle