我正在构建一个Spark应用程序,并在一些自定义Estimators / Transformers中使用Evaluator
类。我遇到了Evaluator
基类没有实现大多数(全部?)其后代(metricName
,RegressionEvaluator
等的BinaryClassificationEvaluator
参数的问题。 ) 实行。具体来说,当编写一个将Estimator和Evaluator作为参数(到.fit
然后.evaluate
一个经过训练的模型)的Validator时,我希望能够存储或记录结果{{1由metricName
生成的{}和metricValue
。如果我明确地将Evaluator
param键入为evaluator
或RegressionEvaluator
,那么这将非常简单,但如果我将其简单地键入为BinaryClassificationEvaluator
,那么我得到{编译时出现{1}}错误。我可以扩展Evaluator
类并使用它(如下所示),但这会在其他区域(val getMetricName is not a member of ...
)中产生一些类型不匹配的问题,这些区域不值得仅仅使{{1}可用。
Evaluator
所以,我的问题:是否有一种简单的方法可以混合或告诉编译器我的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
类以包含此参数,但这可以隐藏在顶级Apache项目中。
答案 0 :(得分:1)
似乎是结构类型的完美案例:
def myMethod(e: Evaluator { def getMetricName: String }): ...