2 votes

IllegalArgumentException lors du calcul d'une PCA avec Spark ML

J'ai un fichier parquet contenant les colonnes id et features et je veux appliquer l'algorithme de PCA.

val dataset =  spark.read.parquet("/usr/local/spark/dataset/data/user")
val features = new VectorAssembler()
    .setInputCols(Array("id", "features" ))
    .setOutputCol("features")
val pca = new PCA()
     .setInputCol("features")
     .setK(50)
     .fit(dataset)
     .setOutputCol("pcaFeatures")
val result = pca.transform(dataset).select("pcaFeatures")
pca.save("/usr/local/spark/dataset/out")

mais j'ai cette exception

java.lang.IllegalArgumentException: l'exigence a échoué : La colonne features doit être de type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 mais était en fait ArrayType(DoubleType,true).

0 votes

Pouvez-vous nous montrer le résultat de dataset.printSchema s'il vous plaît?

1voto

Oli Points 3218

Le transformateur PCA de Spark a besoin d'une colonne créée par un VectorAssembler. Ici, vous en créez une mais ne l'utilisez jamais. De plus, le VectorAssembler ne prend que des nombres en entrée. Je ne sais pas quel est le type de features, mais s'il s'agit d'un tableau, cela ne fonctionnera pas. Transformez d'abord en colonnes numériques. Enfin, il est une mauvaise idée de nommer la colonne assemblée de la même manière qu'une colonne originale. En effet, le VectorAssembler ne supprime pas les colonnes d'entrée et vous vous retrouverez avec deux colonnes features.

Voici un exemple de calcul de PCA fonctionnel dans Spark:

import org.apache.spark.ml.feature._

val df = spark.range(10)
    .select('id, ('id * 'id) as "id2", ('id * 'id * 'id) as "id3")
val assembler = new VectorAssembler()
    .setInputCols(Array("id", "id2", "id3")).setOutputCol("features")
val assembled_df = assembler.transform(df)
val pca = new PCA()
    .setInputCol("features").setOutputCol("pcaFeatures").setK(2)
    .fit(assembled_df)
val result = pca.transform(assembled_df)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X