转换 Spark DataFrame 以进行 ML 处理

Converting a Spark DataFrame for ML processing

我编写了以下代码以将数据提供给 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")

谢谢

此致,

阿迪尔

一个VectorAssembler可以胜任这份工作:

VectorAssembler is a transformer that combines a given list of columns into a single vector column. It is useful for combining raw features [...] into a single feature vector

根据您的代码,解决方案如下所示:

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 只接受以下输入列类型:所有数字类型、布尔类型和向量类型 (same link)。您似乎有一个带双打的 csv,因此推断模式应该有效。但是当然,任何其他将字符串数据转换为双精度数的方法也是可以的。
  2. 使用除第一列以外的所有列作为 VectorAssembler 的输入
  3. 命名 VectorAssembler 的结果列 features
  4. 创建一个名为 label 的新列作为第一列的副本
  5. 删除所有原始列。最后一步是可选的,因为学习算法通常只查看标签和特征列,而忽略所有其他列