Я выполняю перекрестную проверку spark ml с помощью regParam для логистической регрессии как части paramGrid.Оценка
val paramGrid = new ParamGridBuilder()
.addGrid(lr.regParam, Array(0.1, 0.01))
.build()
val validator = new CrossValidator()
.setEstimator(estimator)
.setEvaluator(evaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(3)
здесь включает regParam как часть параметров.Пример кода для сохранения модели:
class MyModelWriter(instance: MyModel[T])extends MLWriter {
override protected def saveImpl(path: String): Unit = {
new DefaultParamsWriter(instance).save(path)
instance.model.save(new Path(path, s"nameOfMofel").toString)
}
}
Mymodel включает regParam в параметры.
MyModel extends HasRegParam
Когда я вызываю модель.save (путь), я получаю исключение:
java.lang.IllegalArgumentException: требование не выполнено: для сохранения ValidatorParams требуются все параметры вestimatorParamMaps для применения к этому ValidatorParams, его Оценщику или Оценщику.Обнаружен посторонний параметр: logreg_2fb5fdbe5012__regParam at scala.Predef $ .require (Predef.scala: 224) в org.apache.spark.ml.tuning.ValidatorParams $$ anonfun $ validateParams $ 1 $ $ anonfun $ Valid $ apply $.scala: 110) в org.apache.spark.ml.tuning.ValidatorParams $$ anonfun $ validateParams $ 1 $$ anonfun $ apply $ 1.apply (ValidatorParams.scala: 109) в scala.collection.mutable.ResizableArray $ class.foreach (ResizableArray.scala: 59) в scala.collection.mutable.ArrayBuffer.foreach (ArrayBuffer.scala: 48) в org.apache.spark.ml.tuning.ValidatorParams $$ anonfun $ validateParams $ 1.apply (ValidatorParams.scala: 109)в org.apache.spark.ml.tuning.ValidatorParams $$ anonfun $ validateParams $ 1.apply (ValidatorParams.scala: 108) в scala.collection.IndexedSeqOptimized $ class.foreach (IndexedSeqOptimized.scala: 33) в scalacol..ArrayOps $ ofRef.foreach (ArrayOps.scala: 186) в org.apache.spark.ml.tuning.ValidatorParams $ .validateParams (ValidatorParams.scala: 108) в org.apache.spark.ml.tuning.CrossValidatorModel $ CrossValidatorModelWriter. (CrossValidator.scala: 257) в org.apache.spark.ml.tuning.CrossValidatorModel.write (CrossValidator.scala: 242) в org.apache.spark.ml.util.MLWritable $ class.save (ReadWrite.scala: 157) в org.apache.spark.ml.tuning.CrossValidatorModel.save (CrossValidator.scala: 210) в com.criteo.lookalike.sink.Sinks $$ anonfun $ SavePipelineParam1 $ 1.применить (Sinks.scala: 111
Код для ValidatorParams.scala на L105 говорит:
// Убедитесь, что все параметры относятся к этому оценщику.Выдает ошибку, если таковой нет.
В соответствии с этим необходимо убедиться, что параметр в estimatorMap, т.е. regParam, в этом случае присутствует в оценщике / оценщике, который в этом случае действительно присутствует в Mymodel выше.
Может кто-нибудь сказать, верно ли мое понимание и если да, что может быть причиной этого?Спасибо.