我使用pyspark开发了一个工具。在该工具中,用户提供模型参数的字典,然后以LogisticRegression(** params)的形式传递给spark.ml模型,如Logistic回归。
由于我现在转移到Scala,我想知道如何使用Scala在Spark中完成此操作?来自Python,我的直觉是传递Scala Map,例如:
val params = Map("regParam" -> 100)
val model = new LogisticRegression().set(params)
显然,它并不像那样微不足道。看起来像在scala中,我们需要分别设置每个参数,例如:
val model = new LogisticRegression()
.setRegParam(0.3)
我真的想避免被强制迭代所有用户输入参数,并用大量的if子句设置适当的参数。
如何像Python一样优雅地解决这个问题?
答案 0 :(得分:0)
根据LogisticRegression API,您需要通过setter单独设置每个参数:
用户可以通过setter设置和获取参数值 吸气剂分别。
一个想法是构建自己的映射函数,以使用反射动态调用相应的参数设置器。
答案 1 :(得分:0)
Scala是一种静态类型语言,因此按设计并没有像Python **params
这样的东西。正如您已经考虑过的那样,您可以将它们存储在类型为Map
的{{1}}中,但由于JVM的运行时约束,type erasure会删除Map值的类型。
Shapeless提供了一些可以解决问题的简洁混合类型功能。另一种方法是使用Scala的[K, Any]
来保存类型信息,如下例所示:
TypeTag