Scala Map作为spark ML模型的参数

时间:2018-03-21 13:49:58

标签: scala apache-spark machine-learning

我使用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一样优雅地解决这个问题?

2 个答案:

答案 0 :(得分:0)

根据LogisticRegression API,您需要通过setter单独设置每个参数:

  

用户可以通过setter设置和获取参数值   吸气剂分别。

一个想法是构建自己的映射函数,以使用反射动态调用相应的参数设置器。

答案 1 :(得分:0)

Scala是一种静态类型语言,因此按设计并没有像Python **params这样的东西。正如您已经考虑过的那样,您可以将它们存储在类型为Map的{​​{1}}中,但由于JVM的运行时约束,type erasure会删除Map值的类型。

Shapeless提供了一些可以解决问题的简洁混合类型功能。另一种方法是使用Scala的[K, Any]来保存类型信息,如下例所示:

TypeTag