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