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)