CrossValidator, настраивающий искру ML, терпящий неудачу на параметрах "Посторонний Param был найден" при сохранении модели - PullRequest
0 голосов
/ 23 мая 2018

Я выполняю перекрестную проверку 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 выше.

Может кто-нибудь сказать, верно ли мое понимание и если да, что может быть причиной этого?Спасибо.

1 Ответ

0 голосов
/ 09 августа 2018

Я только что решил эту точную ошибку.

Когда вы добавляете сетку, попробуйте вместо этого передать экземпляр Param;и, при создании экземпляра Param, сопоставьте его с документированным типом param, как вы найдете в https://spark.apache.org/docs/latest/api/scala/...

Например, в RandomForestRegressor есть numTrees: IntParam.

Поэтому япостроить сетку параметров следующим образом ...

val rf = new RandomForestRegressor()
.{set...()} // (pseudocode)

val numTrees = new IntParam(rf, "numTrees", "Number of trees to train (>= 1) (default = 20)")

// for fun/preference, i make numTrees[Int] increase as does the area of a circle
val numTreesValues = (for (n <- 3 to 20 by 3) yield (math.Pi * math.pow(n, 2)).toInt)

val paramGrid = new ParamGridBuilder()
.addGrid(numTrees, numTreesValues)
.build()

Попробуйте передать оценщик в параметр, затем параметр и значения в .addGrid

Мой валидатор тогда будет выглядеть следующим образом ...

val cv = new CrossValidator()
.setEstimator(rf)
.setEstimatorParamMaps(paramGrid)
.{set...()}
...