IllegalArgumentException при вычислении PCA с помощью Spark ML - PullRequest
2 голосов
/ 26 января 2020

У меня есть файл паркета, содержащий столбцы id и features, и я хочу применить алгоритм 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")

, но у меня есть это исключение

java .lang.IllegalArgumentException: требование не выполнено: элементы столбца должны иметь тип org. apache .spark.ml.linalg. VectorUDT@3bfc3ba7, но на самом деле это ArrayType (DoubleType, true).

1 Ответ

1 голос
/ 27 января 2020

Для преобразователя PCA в Spark требуется столбец, созданный VectorAssembler. Здесь вы создаете один, но никогда не используете его. Кроме того, VectorAssembler принимает только цифры в качестве входных данных. Я не знаю, что типа features, но если это массив, он не будет работать. Сначала преобразуйте его в цифры c столбцов. Наконец, плохая идея называть собранный столбец так же, как и исходный столбец. Действительно, VectorAssembler не удаляет входные столбцы, и в итоге вы получите два features столбца.

Вот рабочий пример вычисления PCA в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...