gpt4 book ai didi

scala - 如何将列转换为向量类型?

转载 作者:行者123 更新时间:2023-12-04 17:45:27 26 4
gpt4 key购买 nike

我在 Spark 中有一个 RDD,其中的对象基于一个案例类:

ExampleCaseClass(user: User, stuff: Stuff)

我想使用 Spark 的 ML 管道,所以我将其转换为 Spark 数据帧。作为管道的一部分,我想将其中一列转换为条目为向量的列。由于我希望该向量的长度随模型而变化,因此它应该作为特征转换的一部分内置到管道中。

所以我试图定义一个 Transformer 如下:
class MyTransformer extends Transformer {

val uid = ""
val num: IntParam = new IntParam(this, "", "")

def setNum(value: Int): this.type = set(num, value)
setDefault(num -> 50)

def transform(df: DataFrame): DataFrame = {
...
}

def transformSchema(schema: StructType): StructType = {
val inputFields = schema.fields
StructType(inputFields :+ StructField("colName", ???, true))
}

def copy (extra: ParamMap): Transformer = defaultCopy(extra)

}

如何指定结果字段的 DataType(即填写???)?它将是某个简单类(Boolean、Int、Double 等)的 Vector。看起来 VectorUDT 可能有效,但这是 Spark 私有(private)的。由于任何 RDD 都可以转换为 DataFrame,因此任何案例类都可以转换为自定义 DataType。但是我不知道如何手动进行这种转换,否则我可以将它应用到一些包装向量的简单案例类中。

此外,如果我为列指定向量类型,当我去拟合模型时,VectorAssembler 是否会正确地将向量处理为单独的特征?

Spark 尤其是 ML Pipeline 仍然是新手,因此感谢任何建议。

最佳答案

import org.apache.spark.mllib.linalg.{Vector, Vectors}

case class MyVector(vector: Vector)
val vectorDF = Seq(
MyVector(Vectors.dense(1.0,3.4,4.4)),
MyVector(Vectors.dense(5.5,6.7))
).toDF

vectorDF.printSchema
root
|-- vector: vector (nullable = true)

println(vectorDF.schema.fields(0).dataType.prettyJson)
{
"type" : "udt",
"class" : "org.apache.spark.mllib.linalg.VectorUDT",
"pyClass" : "pyspark.mllib.linalg.VectorUDT",
"sqlType" : {
"type" : "struct",
"fields" : [ {
"name" : "type",
"type" : "byte",
"nullable" : false,
"metadata" : { }
}, {
"name" : "size",
"type" : "integer",
"nullable" : true,
"metadata" : { }
}, {
"name" : "indices",
"type" : {
"type" : "array",
"elementType" : "integer",
"containsNull" : false
},
"nullable" : true,
"metadata" : { }
}, {
"name" : "values",
"type" : {
"type" : "array",
"elementType" : "double",
"containsNull" : false
},
"nullable" : true,
"metadata" : { }
} ]
}
}

关于scala - 如何将列转换为向量类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36074531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com