2017-04-09 2 views
0

Momentan arbeiten wir an Spark 2.0, und ich möchte wissen, wie der Gradient der Verlustfunktion während des Funkentrainings geändert wurde, mit dem der Trainingsprozess visualisiert werden kann. Zum Beispiel habe ich den folgenden Code:Wie bekomme ich den Gradienten der Verlustfunktion während des Trainings mit 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) 

und ich weiß, gibt es einige Klassen unter Paket „org.apache.spark.mllib.evaluation“ verwendet werden, kann einige Metriken aus dem Modell zu bekommen, aber ich Ich kann immer noch nicht wissen, wie sich der Gradient der Verlustfunktion während des Trainings verändert hat.

Gibt es dafür eine Lösung?

Antwort

2

Leider unterstützt spark-mllib diese Art von Abfrage nicht und wird sie auch in absehbarer Zeit nicht mehr unterstützen.

Auf der anderen Seite können Sie funken-ml 's Version der LogisticRegression mit binomial Familie (die einzige, die für jetzt unterstützt). So können Sie die Verlustfunktion wie folgt berechnen:

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 

Ich hoffe, das hilft.

PS: Diese Lösung funktioniert auch für Spark 1.6.

+0

Wie Sie bereits erwähnt haben, nur LogisticRegression Unterstützung, Verlustfunktion so zu bekommen, ich frage mich nur, ob es einen Plan, um Zusammenfassungsfunktionen zu allen anderen Trainingsmethoden, wie KMeans, DecisionTree, etc. zur Verfügung zu stellen –

Verwandte Themen