Как применить K ближайшего соседа в спарк? - PullRequest
0 голосов
/ 21 января 2020

У меня есть файл паркета (идентификатор, характеристики). Я хочу применить KNN в качестве классификатора. Я использовал алгоритм pca, чтобы уменьшить размеры, затем knn.

    val dataset =  spark.read.parquet("/usr/local/spark/dataset/data/user")
          .toDF()

   val Array(train, test) = dataset.randomSplit(Array(0.8, 0.2), seed = 1234L).map(_.cache())

        val pca = new PCA()
          .setInputCol("features")
          .setK(50)
          .setOutputCol("pcaFeatures")
        val knn = new KNNClassifier()
          .setTopTreeSize(50)
          .setFeaturesCol("pcaFeatures")
          .setPredictionCol("prediction")
          .setK(1)

        val pipeline = new Pipeline()
          .setStages(Array(pca, knn))

        val paramGrid = new ParamGridBuilder()
    //      .addGrid(knn.k, 1 to 20)
          .addGrid(pca.k, 10 to 100 by 10)
          .build()

        val cv = new CrossValidator()
          .setEstimator(pipeline)
          .setEvaluator(new MulticlassClassificationEvaluator)
          .setEstimatorParamMaps(paramGrid)
          .setNumFolds(5)

Но дайте мне эту ошибку. Как решить это?

requirement failed: Column features must be of type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 but was actually ArrayType(DoubleType,true).

1 Ответ

0 голосов
/ 21 января 2020

Используйте VectorAssembler "A feature transformer that merges multiple columns into a vector column - from scaladocs", а затем передайте набор данных функций в конвейер.

Вот пример:

import org.apache.spark.ml.feature.VectorAssembler

val features = new VectorAssembler()
  .setInputCols(Array("col1", "col2", ... ))
  .setOutputCol("features")

val pca = new PCA()
      .setInputCol("features")
      .setK(50)
      .setOutputCol("pcaFeatures")

...

val pipeline = new Pipeline().setStages(Array(pca , knn))
...