Ich baue eine Spark-Anwendung und verwende die Evaluator
Klasse in einigen benutzerdefinierten Estimatoren/Transformatoren. Ich bin auf ein Problem gestoßen, wo die Basisklasse Evaluator
den metricName
Parameter nicht implementiert, den die meisten (alle?) Seiner Nachkommen (RegressionEvaluator
, BinaryClassificationEvaluator
, usw.) implementieren. Insbesondere wenn ich einen Validator schreibe, der einen Estimator und einen Evaluator als Parameter verwendet (bis .fit
und dann .evaluate
ein trainiertes Modell), wäre ich in der Lage, die resultierenden metricName
und metricValue
, die von Evaluator
produziert werden, zu speichern oder zu protokollieren. Das wäre ziemlich einfach, wenn ich explizit evaluator
param entweder als RegressionEvaluator
oder BinaryClassificationEvaluator
tippte, aber wenn ich es einfach als Basis Evaluator
eintippe, dann bekomme ich val getMetricName is not a member of ...
Fehler bei der Kompilierung. Ich kann möglicherweise die Evaluator
Klasse erweitern und (wie unten) verwenden, aber das erzeugt einige Mismatch Kopfschmerzen in anderen Bereichen (found Evaluator, required MyEvaluator
), die nicht den Vorteil wert sind, nur die metricName
verfügbar machen.Hinzufügen von Parametern zu Apache Sparks abstrakte Evaluator-Klasse
trait HasMetricName extends Params {
val metricName: Param[String]
def getMetricName: String = $(metricName)
}
abstract class MyEvaluator extends Evaluator with HasMetricName
Also, meine Frage: Gibt es eine einfache Möglichkeit, dass ich die Compiler mixin oder sagen kann, dass meine Evaluator
Klasse einen metricName
Wert hat oder auch die MyEvaluator
Klasse in einer Art und Weise einsetzen, die nicht propagieren Typdiskrepanzen in anderen Bereichen? Die ideale Lösung wäre, die Klasse Evaluator
einfach so zu bearbeiten, dass sie diesen Parameter enthält, aber das ist in einem Apache-Projekt der obersten Ebene verborgen.
Yup, das macht Sinn! Vielen Dank! –