在新数据上保存和重用 spark mllib LinearRegression 模型
Saving and reusing spark mllib LinearRegression model on new data
我有一个根据历史数据训练的 LinearRegression
模型,现在我正尝试在新数据上重新使用相同的模型来进行预测。
我知道我们可以分别使用 model.save
和 LinearRegression.load
方法保存和加载模型,但是,我无法找到将新数据传递给加载模型进行预测的方法。
下面粘贴了创建和训练模型的代码:
val assembler = new VectorAssembler().setInputCols(Array("total", "connected", "c_403", "c_480", "c_503", "hour", "day_of_week")).setOutputCol("features")
val output = assembler.transform(df).select($"label", $"features")
val Array(training, test) = output.select("label", "features").randomSplit(Array(0.7, 0.3), seed = 12)
val lr = new LinearRegression()
val paramGrid = new ParamGridBuilder().addGrid(lr.regParam, Array(0.1, 0.01)).addGrid(lr.fitIntercept).addGrid(lr.elasticNetParam, Array(0.0, 0.25, 0.5, 0.75, 1.0)).build()
val trainvalSplit = new TrainValidationSplit().setEstimator(lr).setEvaluator(new RegressionEvaluator()).setEstimatorParamMaps(paramGrid).setTrainRatio(0.75)
val model = trainvalSplit.fit(training)
val holdout = model.transform(test).select("prediction","label")
好的,实际上这很简单,但是考虑到您已经使用 model.save("/home/waqas/models/lreg")
保存了模型,您需要使用 TrainValidationSplitModel
而不是 LinearRegressionModel
来加载模型:
scala> import org.apache.spark.ml.tuning.TrainValidationSplitModel
scala> val model2 = TrainValidationSplitModel.load("/home/waqas/models/lreg")
// model2: org.apache.spark.ml.tuning.TrainValidationSplitModel = tvs_99887a2f788d
scala> model2.transform(newData).show(3)
// +-----+--------------------+--------------------+
// |label| features| prediction|
// +-----+--------------------+--------------------+
// | 0.0|(692,[121,122,123...| 0.11220528529664375|
// | 0.0|(692,[122,123,148...| 0.1727599038728312|
// | 0.0|(692,[123,124,125...|-0.09619225628995537|
// +-----+--------------------+--------------------+
// only showing top 3 rows
我有一个根据历史数据训练的 LinearRegression
模型,现在我正尝试在新数据上重新使用相同的模型来进行预测。
我知道我们可以分别使用 model.save
和 LinearRegression.load
方法保存和加载模型,但是,我无法找到将新数据传递给加载模型进行预测的方法。
下面粘贴了创建和训练模型的代码:
val assembler = new VectorAssembler().setInputCols(Array("total", "connected", "c_403", "c_480", "c_503", "hour", "day_of_week")).setOutputCol("features")
val output = assembler.transform(df).select($"label", $"features")
val Array(training, test) = output.select("label", "features").randomSplit(Array(0.7, 0.3), seed = 12)
val lr = new LinearRegression()
val paramGrid = new ParamGridBuilder().addGrid(lr.regParam, Array(0.1, 0.01)).addGrid(lr.fitIntercept).addGrid(lr.elasticNetParam, Array(0.0, 0.25, 0.5, 0.75, 1.0)).build()
val trainvalSplit = new TrainValidationSplit().setEstimator(lr).setEvaluator(new RegressionEvaluator()).setEstimatorParamMaps(paramGrid).setTrainRatio(0.75)
val model = trainvalSplit.fit(training)
val holdout = model.transform(test).select("prediction","label")
好的,实际上这很简单,但是考虑到您已经使用 model.save("/home/waqas/models/lreg")
保存了模型,您需要使用 TrainValidationSplitModel
而不是 LinearRegressionModel
来加载模型:
scala> import org.apache.spark.ml.tuning.TrainValidationSplitModel
scala> val model2 = TrainValidationSplitModel.load("/home/waqas/models/lreg")
// model2: org.apache.spark.ml.tuning.TrainValidationSplitModel = tvs_99887a2f788d
scala> model2.transform(newData).show(3)
// +-----+--------------------+--------------------+
// |label| features| prediction|
// +-----+--------------------+--------------------+
// | 0.0|(692,[121,122,123...| 0.11220528529664375|
// | 0.0|(692,[122,123,148...| 0.1727599038728312|
// | 0.0|(692,[123,124,125...|-0.09619225628995537|
// +-----+--------------------+--------------------+
// only showing top 3 rows