Преобразование Spark DataFrame для обработки ML - PullRequest
0 голосов
/ 31 августа 2018

Я написал следующий код для подачи данных в алгоритм машинного обучения в Spark 2.3. Код ниже работает нормально. Мне нужно улучшить этот код, чтобы можно было конвертировать не только 3 столбца, но и любое количество столбцов, загруженных через файл CSV. Например, если я загрузил 5 столбцов, как я могу автоматически разместить их в приведенной ниже команде Vector.dense или каким-либо другим способом получить тот же конечный результат? Кто-нибудь знает, как это можно сделать?

val data2 = spark.read.format("csv").option("header", 
"true").load("/data/c7.csv")
val goodBadRecords = data2.map(
  row =>{ 
  val n0 = row(0).toString.toLowerCase().toDouble
  val n1 = row(1).toString.toLowerCase().toDouble
  val n2 = row(2).toString.toLowerCase().toDouble
  val n3 = row(3).toString.toLowerCase().toDouble  
  (n0, Vectors.dense(n1,n2,n3))    
 }
).toDF("label", "features")

Спасибо

С уважением,

Adeel

1 Ответ

0 голосов
/ 31 августа 2018

A VectorAssembler может выполнять работу:

VectorAssembler - это преобразователь, который объединяет заданный список столбцов в один векторный столбец. Это полезно для объединения [...] необработанных элементов в один вектор элементов

Исходя из вашего кода, решение будет выглядеть так:

val data2 = spark.read.format("csv")
  .option("header","true")
  .option("inferSchema", "true") //1
  .load("/data/c7.csv")

val fields = data2.schema.fieldNames

val assembler = new VectorAssembler()
  .setInputCols(fields.tail) //2
  .setOutputCol("features") //3

val goodBadRecords = assembler.transform(data2)
  .withColumn("label", col(fields(0))) //4
  .drop(fields:_*) //5

Примечания:

  1. Схема необходима для входных данных, поскольку VectorAssembler принимает только следующие типы входных столбцов: все числовые типы, логический тип и векторный тип ( та же ссылка ). Похоже, у вас есть CSV с двойными, поэтому вывод схемы должен работать. Но, конечно, любой другой метод для преобразования строковых данных в удвоения тоже подойдет.
  2. Использовать все, кроме первого столбца, в качестве входных данных для VectorAssembler
  3. Назовите столбец результатов VectorAssembler * функции 1021 *
  4. Создать новый столбец с именем label как копию первого столбца
  5. Отбросьте все оригинальные столбцы. Этот последний шаг является необязательным, поскольку алгоритм обучения обычно просматривает только метку и столбец функций и игнорирует все остальные столбцы
...