Spark: преобразовать RDD [LabeledPoint] в Dataframe, чтобы применить MinMaxScaler, и после масштабирования получить нормализованный RDD [LabeledPoint]. - PullRequest
0 голосов
/ 10 мая 2018

Я использую RDD [LabeledPoint] в своем коде. Но теперь я должен нормализовать данные, используя метод MinMax.

Я видел, что в библиотеке ml существует MinMaxScaler, но это работает с DataFrames: org.apache.spark.ml.feature.MinMaxScaler.

Поскольку полный код уже был написан с помощью RDD, я думаю, что могу сделать следующие шаги, чтобы ничего не менять:

  1. Преобразование RDD [LabeledPoint] в DataFrame
  2. Применение MinMaxScaler к кадру данных
  3. Преобразование кадра данных в RDD [LabeledPoint]

Дело в том, что я не умею это делать. У меня нет имен столбцов (но вектор объектов в LabeledPoint имеет размерность 9), и я также не смог адаптировать другие примеры к своему случаю. Например, код в: https://stackoverflow.com/a/36909553/5081366 или Масштабирование каждого столбца кадра данных

Буду признателен за вашу помощь!

1 Ответ

0 голосов
/ 10 мая 2018

Наконец, я могу ответить на свой вопрос!

Где allData - это RDD[LabeledPoint]:

    // The following import doesn't work externally because the implicits object is defined inside the SQLContext class
    val sqlContext = SparkSession
      .builder()
      .appName("Spark In Action")
      .master("local")
      .getOrCreate()

    import sqlContext.implicits._

    // Create a DataFrame from RDD[LabeledPoint]
    val all = allData.map(e => (e.label, e.features))
    val df_all = all.toDF("labels", "features")

    // Scaler instance above with the same min(0) and max(1)
    val scaler = new MinMaxScaler()
      .setInputCol("features")
      .setOutputCol("featuresScaled")
      .setMax(1)
      .setMin(0)

    // Scaling
    var df_scaled = scaler.fit(df_all).transform(df_all)

    // Drop the unscaled column
    df_scaled = df_scaled.drop("features")

    // Convert DataFrame to RDD[LabeledPoint]
    val rdd_scaled = df_scaled.rdd.map(row => LabeledPoint(
      row.getAs[Double]("labels"),
      row.getAs[Vector]("featuresScaled")
    ))

Надеюсь, это поможет кому-то еще!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...