将参数添加到 Apache Spark 的抽象评估器 class
Adding params to Apache Spark's abstract Evaluator class
我正在构建一个 Spark 应用程序并在一些自定义 Estimators/Transformers 中使用 Evaluator
class。我 运行 遇到一个问题,其中 Evaluator
基础 class 没有实现 metricName
参数,大多数(全部?)它的后代(RegressionEvaluator
, BinaryClassificationEvaluator
, 等等)实施。具体来说,当编写一个以 Estimator 和 Evaluator 作为参数的验证器时(到 .fit
然后 .evaluate
一个训练有素的模型),我希望能够存储或记录结果 metricName
和 metricValue
由 Evaluator
生成。如果我将 evaluator
参数显式键入为 RegressionEvaluator
或 BinaryClassificationEvaluator
,那将非常简单,但如果我将它简单地键入为基础 Evaluator
,那么我得到 val getMetricName is not a member of ...
编译时出错。我可以潜在地扩展 Evaluator
class 并使用它(如下所示),但这会在其他区域(found Evaluator, required MyEvaluator
)造成一些类型不匹配的问题,这不值得仅仅使metricName
可用。
trait HasMetricName extends Params {
val metricName: Param[String]
def getMetricName: String = $(metricName)
}
abstract class MyEvaluator extends Evaluator with HasMetricName
所以,我的问题是:有没有一种简单的方法可以混合或告诉编译器我的 Evaluator
class 有一个 metricName
值,否则插入 MyEvaluator
class 不会在其他区域传播类型不匹配错误?理想的解决方案是简单地编辑 Evaluator
class 以包含此参数,但它隐藏在顶级 Apache 项目中。
似乎是结构类型的完美案例:
def myMethod(e: Evaluator { def getMetricName: String }): ...
我正在构建一个 Spark 应用程序并在一些自定义 Estimators/Transformers 中使用 Evaluator
class。我 运行 遇到一个问题,其中 Evaluator
基础 class 没有实现 metricName
参数,大多数(全部?)它的后代(RegressionEvaluator
, BinaryClassificationEvaluator
, 等等)实施。具体来说,当编写一个以 Estimator 和 Evaluator 作为参数的验证器时(到 .fit
然后 .evaluate
一个训练有素的模型),我希望能够存储或记录结果 metricName
和 metricValue
由 Evaluator
生成。如果我将 evaluator
参数显式键入为 RegressionEvaluator
或 BinaryClassificationEvaluator
,那将非常简单,但如果我将它简单地键入为基础 Evaluator
,那么我得到 val getMetricName is not a member of ...
编译时出错。我可以潜在地扩展 Evaluator
class 并使用它(如下所示),但这会在其他区域(found Evaluator, required MyEvaluator
)造成一些类型不匹配的问题,这不值得仅仅使metricName
可用。
trait HasMetricName extends Params {
val metricName: Param[String]
def getMetricName: String = $(metricName)
}
abstract class MyEvaluator extends Evaluator with HasMetricName
所以,我的问题是:有没有一种简单的方法可以混合或告诉编译器我的 Evaluator
class 有一个 metricName
值,否则插入 MyEvaluator
class 不会在其他区域传播类型不匹配错误?理想的解决方案是简单地编辑 Evaluator
class 以包含此参数,但它隐藏在顶级 Apache 项目中。
似乎是结构类型的完美案例:
def myMethod(e: Evaluator { def getMetricName: String }): ...