我正在使用 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")
问题是,当我加载模型时,没有fit
或train
功能来继续训练。
当我加载LinearRegression对象时,似乎它不保存权重,只保存算法的参数。
我通过对相同数量的迭代训练相同的数据来测试它,结果是完全相同的rootMeanSquaredError
,并且在这个学习点上肯定没有收敛。
我也无法将模型加载到LinearRegression中,导致错误:
Exception in thread "main" java.lang.NoSuchMethodException: org.apache.spark.ml.regression.LinearRegressionModel.<init>(java.lang.String)
所以问题是,如何让LinearRegression对象使用保存的LinearRegressionModel?
答案 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(