14

Chcę znaleźć parametry ParamGridBuilder które sprawiają, że najlepszy model w CrossValidator w Spark 1.4.x,Jak wyodrębnić najlepsze parametry z CrossValidatorModel

W Pipeline Example w dokumentacji Spark, dodają różne parametry (numFeatures, regParam) przy użyciu ParamGridBuilder w potoku. Następnie za pomocą następującego wiersza kodu robią najlepszego modelu:

val cvModel = crossval.fit(training.toDF) 

Teraz chcę wiedzieć, jakie są parametry (numFeatures, regParam) od ParamGridBuilder która produkuje najlepszy model.

już stosowane następujące polecenia bez powodzenia:

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

Każda pomoc?

Dzięki z góry,

+2

Najlepsze parametry to [zrzucane na logowanie] (https://github.com/apache/spark/blob/a721ee52705100dbd7852f80f92cde4375517e48/mllib/src/main/scala/org/apache/spark/ml/tuning/CrossValidator.scala# L104), ale bije mnie, jak uzyskać dostęp do tej informacji z instancji 'CrossValidatorModel'. – zero323

+1

To naprawdę frustrujące. Nawet nie logują się w PySpark. Tak mała, ale ważna rzecz, której brakuje ... zastanawiam się, czy ktoś faktycznie używa tej funkcji. –

+0

ludzie, jakiekolwiek rozwiązanie tego problemu w najnowszych wersjach Spark? – Rami

Odpowiedz

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

Jednym ze sposobów, aby uzyskać właściwe ParamMap obiekt jest użycie CrossValidatorModel.avgMetrics: Array[Double] znaleźć argmax ParamMap:

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

Po uruchomieniu na CrossValidatorModel Wyszkolony w Pipeline Przykład, który cytowaliście daje:

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

Uwaga: 'maxBy' może wymagać' minBy', w zależności od wartości 'Evaluator.isLargerBetter'. – metasim

1

To ParamGridBuilder()

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

Istnieją 3 etapy rurociągu. Wydaje się, że możemy ocenić następujące parametry:

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

Jednak w ostatnim etapie nie ma parametru, logiscRegression.

Możemy również uzyskać waga i przechwycenia parametr z logistregression jak następuje:

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

Pełna eksploracja: http://kuanliang.github.io/2016-06-07-SparkML-pipeline/

3

W ten sposób można uzyskać wybrane parametry

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

Prosimy nie dodawać tej samej odpowiedzi do wielu pytań. Odpowiedz na najlepszą i oznacz flagę jako duplikaty. Zobacz http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplicate-answer-to-several-questions –

1

ten kod Java powinno działać: cvModel.bestModel().parent().extractParamMap() .you może przełożyć go do kodu scala parent() metody zwróci prognozy, można uzyskać najlepsze params wtedy.

Powiązane problemy