【问题标题】:Converting a Spark DataFrame for ML processing转换 Spark DataFrame 以进行 ML 处理
【发布时间】:2019-02-06 14:37:21
【问题描述】:

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

谢谢

问候,

阿迪尔

【问题讨论】:

    标签: scala apache-spark apache-spark-sql apache-spark-mllib apache-spark-ml


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2017-03-17
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多