Spark负载模型并继续培训

时间:2016-09-01 13:01:16

标签: scala apache-spark machine-learning linear-regression

我正在使用 Scala Spark 2.0 来训练具有 LinearRegression 的模型。

val lr = new LinearRegression()
  .setMaxIter(num_iter)
  .setRegParam(reg)
  .setStandardization(true)

val model = lr.fit(data)

这很好,我得到了很好的结果。 我保存了模型并将其加载到另一个类中以进行一些预测:

val model = LinearRegressionModel.load("models/LRModel")
val result = model.transform(data).select("prediction")

现在我想继续使用新数据训练模型,所以我保存了模型并加载它以继续训练。

保存:

model.save("models/LRModel")
lr.save("models/LR")

装载:

val lr = LinearRegression.load("models/LR")
val model = LinearRegressionModel.load("models/LRModel")

问题是,当我加载模型时,没有fittrain功能来继续训练。 当我加载LinearRegression对象时,似乎它不保存权重,只保存算法的参数。 我通过对相同数量的迭代训练相同的数据来测试它,结果是完全相同的rootMeanSquaredError,并且在这个学习点上肯定没有收敛。 我也无法将模型加载到LinearRegression中,导致错误:

Exception in thread "main" java.lang.NoSuchMethodException: org.apache.spark.ml.regression.LinearRegressionModel.<init>(java.lang.String)

所以问题是,如何让LinearRegression对象使用保存的LinearRegressionModel?

1 个答案:

答案 0 :(得分:0)

您可以使用管道来保存和加载机器学习模型。

import org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.ml.PipelineModel
val lr = new LinearRegression().setLabelCol("labesl").setFeaturesCol("features").setMaxIter(10).setRegParam(1.0).setElasticNetParam(1.0)

val pipeline = new Pipeline().setStages(Array(lr))

pipeline.fit(trainingData)

pipeline.write.overwrite().save("hdfs://.../spark/mllib/models/linearRegression");

val sameModel = PipelineModel.load("hdfs://...")

sameModel.transform(assembler).select("features", "labels", "prediction").show(