14

ich die Parameter von ParamGridBuilder, die das beste ModellWie man am besten Parameter von einem CrossValidatorModel

In Pipeline Example in Spark-Dokumentation in CrossValidator in Spark-1.4.x, machen finden extrahieren möchten, fügen sie verschiedene Parameter (numFeatures, regParam) mit ParamGridBuilder in der Pipeline. Dann durch die folgende Codezeile sie machen das beste Modell:

val cvModel = crossval.fit(training.toDF) 

Nun, ich will wissen, was sind die Parameter (numFeatures, regParam) von ParamGridBuilder, die das beste Modell produziert.

habe ich bereits die folgenden Befehle ohne Erfolg:

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

Jede Hilfe?

Vielen Dank im Voraus,

+2

Die besten Parameter sind [zu protokollieren] (https://github.com/apache/spark/blob/a721ee52705100dbd7852f80f92cde4375517e48/mllib/src/main/scala/org/apache/spark/ml/tuning/CrossValidator.scala#) L104) aber wie ich auf diese Informationen von einer 'CrossValidatorModel' Instanz zugreifen kann. – zero323

+1

Das ist wirklich frustrierend. Sie protokollieren es nicht einmal in PySpark. Eine so kleine, aber wichtige Sache, die fehlt ... ich frage mich, ob jemand diese Funktionalität wirklich nutzt. –

+0

Leute, irgendeine Lösung für dieses Problem in den letzten Versionen von Spark? – Rami

Antwort

9
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) 

source

12

Eine Methode, ein richtiges ParamMap Objekt zu erhalten, ist CrossValidatorModel.avgMetrics: Array[Double] zu verwenden, um die argmax ParamMap zu finden: auf den CrossValidatorModel

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

Sobald er ausgeführt werden In dem von Ihnen zitierten Pipeline-Beispiel haben Sie gelernt:

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

Hinweis: "maxBy" muss möglicherweise "minBy" sein, abhängig vom Wert von "Evaluator.isLargerBetter". – metasim

1

Dies ist der ParamGridBuilder()

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

Es gibt 3 Stufen in der Pipeline. Es scheint, wir Parameter wie folgt beurteilen:

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 
[] 

Es besteht jedoch keine Parameter in der letzten Stufe ist, logiscRegression.

Wir können auch Gewicht und abfangen Parameter von logistregression wie folgt erhalten:

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]) 

Voll Exploration: http://kuanliang.github.io/2016-06-07-SparkML-pipeline/

3

Dies ist, wie Sie die gewählten Parameter erhalten

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

Bitte fügen Sie nicht die gleiche Antwort zu mehreren Fragen hinzu. Beantworte die beste und markiere den Rest als Duplikate. Siehe http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplicate-answer-to-several-questions –

1

sollte Java-Code arbeiten: cvModel.bestModel().parent().extractParamMap() .you es scala Code parent() Methode einen Schätzer übersetzen kann, wird zurückkehren, können Sie die besten params dann bekommen.

Verwandte Themen