scala apache-spark pipeline cross-validation apache-spark-mllib

scala - Cómo extraer los mejores parámetros de un CrossValidatorModel



apache-spark pipeline (5)

Así es como obtienes los parámetros elegidos

println(cvModel.bestModel.getMaxIter) println(cvModel.bestModel.getRegParam)

Quiero encontrar los parámetros de ParamGridBuilder que hacen el mejor modelo en CrossValidator en Spark 1.4.x,

En Pipeline Example en la documentación de Spark, agregan diferentes parámetros ( numFeatures , regParam ) utilizando ParamGridBuilder en Pipeline. Luego, mediante la siguiente línea de código, crean el mejor modelo:

val cvModel = crossval.fit(training.toDF)

Ahora, quiero saber cuáles son los parámetros ( numFeatures , regParam ) de ParamGridBuilder que produce el mejor modelo.

Ya utilicé los siguientes comandos sin éxito:

cvModel.bestModel.extractParamMap().toString() cvModel.params.toList.mkString("(", ",", ")") cvModel.estimatorParamMaps.toString() cvModel.explainParams() cvModel.getEstimatorParamMaps.mkString("(", ",", ")") cvModel.toString()

¿Alguna ayuda?

Gracias por adelantado,


Este es el ParamGridBuilder ()

paraGrid = ParamGridBuilder().addGrid( hashingTF.numFeatures, [10, 100, 1000] ).addGrid( lr.regParam, [0.1, 0.01, 0.001] ).build()

Hay 3 etapas en la tubería. Parece que podemos evaluar los parámetros de la siguiente manera:

for stage in cv_model.bestModel.stages: print ''stages: {}''.format(stage) print stage.params print ''/n'' stage: Tokenizer_46ffb9fac5968c6c152b [Param(parent=''Tokenizer_46ffb9fac5968c6c152b'', name=''inputCol'', doc=''input column name''), Param(parent=''Tokenizer_46ffb9fac5968c6c152b'', name=''outputCol'', doc=''output column name'')] stage: HashingTF_40e1af3ba73764848d43 [Param(parent=''HashingTF_40e1af3ba73764848d43'', name=''inputCol'', doc=''input column name''), Param(parent=''HashingTF_40e1af3ba73764848d43'', name=''numFeatures'', doc=''number of features''), Param(parent=''HashingTF_40e1af3ba73764848d43'', name=''outputCol'', doc=''output column name'')] stage: LogisticRegression_451b8c8dbef84ecab7a9 []

Sin embargo, no hay ningún parámetro en la última etapa, logiscRegression.

También podemos obtener el peso y el parámetro de intercepción de la logística de regresión como el siguiente:

cv_model.bestModel.stages[1].getNumFeatures() 10 cv_model.bestModel.stages[2].intercept 1.5791827733883774 cv_model.bestModel.stages[2].weights DenseVector([-2.5361, -0.9541, 0.4124, 4.2108, 4.4707, 4.9451, -0.3045, 5.4348, -0.1977, -1.8361])

Exploración completa: http://kuanliang.github.io/2016-06-07-SparkML-pipeline/


Un método para obtener un objeto ParamMap adecuado es usar CrossValidatorModel.avgMetrics: Array[Double] para encontrar el argmax ParamMap :

implicit class BestParamMapCrossValidatorModel(cvModel: CrossValidatorModel) { def bestEstimatorParamMap: ParamMap = { cvModel.getEstimatorParamMaps .zip(cvModel.avgMetrics) .maxBy(_._2) ._1 } }

Cuando se ejecuta en CrossValidatorModel entrenado en el ejemplo Pipeline que usted citó da:

scala> println(cvModel.bestEstimatorParamMap) { hashingTF_2b0b8ccaeeec-numFeatures: 100, logreg_950a13184247-regParam: 0.1 }


este código java debería funcionar: cvModel.bestModel().parent().extractParamMap() .puedes traducirlo al código scala El método parent() devolverá un estimador, entonces puedes obtener los mejores params.


val bestPipelineModel = cvModel.bestModel.asInstanceOf[PipelineModel] val stages = bestPipelineModel.stages val hashingStage = stages(1).asInstanceOf[HashingTF] println("numFeatures = " + hashingStage.getNumFeatures) val lrStage = stages(2).asInstanceOf[LogisticRegressionModel] println("regParam = " + lrStage.getRegParam)

fuente