7

Ich erhalte die folgende Fehlermeldung versucht, einen ML zu bauen Pipeline:Wie konvertiert man ArrayType in DenseVector in PySpark DataFrame?

pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Column features must be of type [email protected] but was actually ArrayType(DoubleType,true).' 

Meine features Spalte enthält ein Array von Gleitkommazahlen. Es klingt, als müsste ich diese in eine Art Vektor umwandeln (es ist nicht spärlich, also ein DenseVector?). Gibt es eine Möglichkeit, dies direkt auf dem DataFrame zu tun, oder muss ich in eine RDD konvertieren?

Antwort

12

Sie können UDF verwenden:

udf(lambda vs: Vectors.dense(vs), VectorUDT()) 

In Spark-< 2.0-Import:

from pyspark.mllib.linalg import Vectors, VectorUDT 

In Funken 2.0+ Import:

from pyspark.ml.linalg import Vectors, VectorUDT 

Bitte beachten Sie, dass diese Klassen nicht kompatibel sind trotz identischer Implementierung.

Es ist auch möglich, einzelne Merkmale zu extrahieren und mit VectorAssembler zu montieren. Angenommen, die Eingabespalte heißt features:

from pyspark.ml.feature import VectorAssembler 

n = ... # Size of features 

assembler = VectorAssembler(
    inputCols=["features[{0}]".format(i) for i in range(n)], 
    outputCol="features_vector") 

assembler.transform(df.select(
    "*", *(df["features"].getItem(i) for i in range(n)) 
)) 
Verwandte Themen