2017-04-09 7 views
0

現在、私たちはSpark 2.0について取り組んでおり、スパークトレーニング中にどのように喪失関数の勾配が変更されたかを知りたいので、訓練プロセスを視覚化するために使用できます。 例えば、私は次のコードを持っている:spark 2.0を使ったトレーニング中に損失関数の勾配を得る方法はありますか?

// Load training data in LIBSVM format. 
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt") 

// Split data into training (60%) and test (40%). 
val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) 
val training = splits(0).cache() 
val test = splits(1) 

// Run training algorithm to build the model 
val model = new LogisticRegressionWithLBFGS() 
    .setNumClasses(10) 
    .run(training) 

を、私はパッケージの下にいくつかのクラスがあります知っている「org.apache.spark.mllib.evaluation」モデルからいくつかの指標を取得するために使用することができますが、I訓練プロセス中に損失関数の勾配がどのように変化したかをまだ知ることができない。

解決方法はありますか?

答えて

2

残念ながら、spark-mllibはこのタイプのクエリをサポートしておらず、廃止予定のためすぐにサポートされることはありません。

一方、のspark-mlのバージョンはbinomialファミリー(現在のところサポートされている唯一のもの)を使用できます。したがって、以下のように損失関数を計算することができます。

scala> import org.apache.spark.ml.classification.LogisticRegression 
scala> val training = spark.read.format("libsvm").load("./data/mllib/sample_libsvm_data.txt") 
// training: org.apache.spark.sql.DataFrame = [label: double, features: vector] 

scala> val lr = new LogisticRegression().setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8) 
// lr: org.apache.spark.ml.classification.LogisticRegression = logreg_ea4e7cd94045 

scala> val lrModel = lr.fit(training) 
// 17/04/10 11:51:19 WARN LogisticRegression: LogisticRegression training finished but the result is not converged because: max iterations reached 
// lrModel: org.apache.spark.ml.classification.LogisticRegressionModel = logreg_ea4e7cd94045 

scala> val trainingSummary = lrModel.summary 
trainingSummary: org.apache.spark.ml.classification.LogisticRegressionTrainingSummary = org.apache.[email protected]2878abcd 

scala> val objectiveHistory = trainingSummary.objectiveHistory 
// objectiveHistory: Array[Double] = Array(0.6833149135741672, 0.6662875751473734, 0.6217068546034619, 0.6127265245887887, 0.6060347986802872, 0.6031750687571562, 0.5969621534836274, 0.5940743031983119, 0.5906089243339021, 0.589472457649104, 0.5882187775729588) 

scala> objectiveHistory.foreach(loss => println(loss)) 
// 0.6833149135741672 
// 0.6662875751473734 
// 0.6217068546034619 
// 0.6127265245887887 
// 0.6060347986802872 
// 0.6031750687571562 
// 0.5969621534836274 
// 0.5940743031983119 
// 0.5906089243339021 
// 0.589472457649104 
// 0.5882187775729588 

これが役立つことを望みます。

PS:この解決策は、スパーク1.6でも機能します。

+0

あなたが言ったように、LogisticRegressionだけが損失関数を取得するようにサポートしていますが、KMeans、DecisionTreeなどの他のすべてのトレーニングメソッドにサマリー関数を提供する計画があるかどうかは疑問です。 –

関連する問題