2017-04-09 22 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」可以用來從模型中的一些指標,但我我仍然無法知道在訓練過程中損失函數的梯度如何變化。

有沒有解決方案?

回答

2

不幸的是spark-mllib不支持這種類型的查詢,並且由於不推薦使用,它不會在任何時候支持它。另一方面,您可以使用spark-ml的LogisticRegression版本和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:該解決方案也適用於spark 1.6。

+0

正如你所提到的,只有LogisticRegression支持以這種方式獲得損失函數,我只是想知道是否有計劃爲所有其他培訓方法提供彙總函數,如KMeans,DecisionTree等。 –

相關問題