web-dev-qa-db-ja.com

CrossValidatorModelから最適なパラメーターを抽出する方法

Spark 1.4.x、のCrossValidatorで最高のモデルを作るParamGridBuilderのパラメーターを見つけたい

パイプラインの例 Sparkのドキュメントでは、numFeaturesを使用してさまざまなパラメーター(regParamParamGridBuilder)を追加します次に、次のコード行により、最適なモデルが作成されます。

val cvModel = crossval.fit(training.toDF)

ここで、最良のモデルを生成するnumFeaturesからのパラメーター(regParamParamGridBuilder)は何かを知りたいです。

私はすでに次のコマンドを使用して成功しませんでした:

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

何か助けは?

前もって感謝します、

27
Mohammad

適切なParamMapオブジェクトを取得する1つの方法は、CrossValidatorModel.avgMetrics: Array[Double]を使用してargmax ParamMapを見つけることです。

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

引用したパイプラインの例でトレーニングされたCrossValidatorModelで実行すると、次のようになります。

scala> println(cvModel.bestEstimatorParamMap)
{
   hashingTF_2b0b8ccaeeec-numFeatures: 100,
   logreg_950a13184247-regParam: 0.1
}
17
Adam Vogel
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)

ソース

12
macfeliga

これは、選択したパラメーターを取得する方法です

println(cvModel.bestModel.getMaxIter)   
println(cvModel.bestModel.getRegParam)  
3
Mazen Aly

すべてをparamMapに出力するには、実際には親を呼び出す必要はありません。

cvModel.bestModel().extractParamMap()

OPの質問に答えて、単一の最適なパラメーターを取得するには、たとえばregParam

cvModel.bestModel().extractParamMap().apply(cvModel.bestModel.getParam("regParam"))
2
Algorithman

this Javaコードが機能する必要があります:cvModel.bestModel().parent().extractParamMap()。これをscala code parent() methodに変換すると、推定量が返されます、それからあなたは最高のパラメータを得ることができます。

2
orangeHIX

これはParamGridBuilder()です

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

パイプラインには3つのステージがあります。次のようにパラメーターを評価できるようです。

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

ただし、最後のステージであるlogiscRegressionにはパラメーターはありません。

weightおよびintercept次のようなlogistregressionからのパラメーター:

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

完全な探索: http://kuanliang.github.io/2016-06-07-SparkML-pipeline/

1
劉冠良

私はSpark Scala 1.6.xを使用しています。ここにCrossValidatorを設定してフィットさせてから返す方法の完全な例があります最適なモデルを取得するために使用されるパラメーターの値(training.toDFは、すぐに使用できるデータフレームを提供します):

import org.Apache.spark.ml.classification.LogisticRegression
import org.Apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder}
import org.Apache.spark.ml.evaluation.MulticlassClassificationEvaluator

// Instantiate a LogisticRegression object
val lr = new LogisticRegression()

// Instantiate a ParamGrid with different values for the 'RegParam' parameter of the logistic regression
val paramGrid = new ParamGridBuilder().addGrid(lr.regParam, Array(0.0001, 0.001, 0.01, 0.1, 0.25, 0.5, 0.75, 1)).build()

// Setting and fitting the CrossValidator on the training set, using 'MultiClassClassificationEvaluator' as evaluator
val crossVal = new CrossValidator().setEstimator(lr).setEvaluator(new MulticlassClassificationEvaluator).setEstimatorParamMaps(paramGrid)
val cvModel = crossVal.fit(training.toDF)

// Getting the value of the 'RegParam' used to get the best model
val bestModel = cvModel.bestModel                    // Getting the best model
val paramReference = bestModel.getParam("regParam")  // Getting the reference of the parameter you want (only the reference, not the value)
val paramValue = bestModel.get(paramReference)       // Getting the value of this parameter
print(paramValue)                                    // In my case : 0.001

パラメータや他のタイプのモデルについても同じことができます。

0
François

enter image description here

Javaの場合は、このデバッグショーを参照してください。

bestModel.parent().extractParamMap()
0
裴帅帅

パイプラインで機能する単一ライナーである@macfeligaのソリューションを構築します。

cvModel.bestModel.asInstanceOf[PipelineModel]
    .stages.foreach(stage => println(stage.extractParamMap))