使用保存的模型来转换另一个数据而无需再次拟合Spark

时间:2019-11-08 20:37:43

标签: scala apache-spark apache-spark-mllib

我正在Scala中使用Spark(核心和Mllib)版本2.2.0。

我成功地用Logistic回归保存了CrossValidator模型。下面是我使用的代码

  val cv = new CrossValidator()
    .setEstimator(lr)
    .setEvaluator(new BinaryClassificationEvaluator)
    .setEstimatorParamMaps(paramGrid)
    .setNumFolds(5)

  val model = cv.fit(trainingData)

  model.write.overwrite().save("./cvmodel")

之后,我尝试将其用于具有以下代码的另一个数据集

  val model = CrossValidatorModel.read.load("./cvmodel")

  val cleanData = DataApi.cleanData(dataset, spark) // custom method

  val preparedData = DataApi.oneHotEncodingData(cleanData).select("label","features") // custom method

  val predict_dataset = model.transform(preparedData)

  printResult(predict_dataset) // A custom method that uses metrics to print the statistics
                               // of the result

但是,当使用与测试数据相比大小不同的数据集(或多或少)时,会抛出此错误

java.lang.IllegalArgumentException: requirement failed: BLAS.dot(x: Vector, y:Vector) was given Vectors with non-matching sizes: x.size = 1178, y.size = 9921

该代码实际上正在使用相同大小的数据集。因此,我想知道是否可以将保存的模型与另一个具有不同大小的数据集一起使用,而无需再次进行拟合。如果是这样,我想知道如何。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我实际上找到了此错误的原因。在我的一个热编码过程中,实际上我使用的是一些我没有保存的管道,例如CrossValidatorModel。我要做的是:

  1. 将我的一个热门编码管道与我的训练数据集相适应,并将它们另存为模型
  2. 将我的CrossValidator与我的训练数据集相匹配,并将其另存为模型
  3. 加载我的一个热编码管道模型并转换测试数据集
  4. 加载我的CrossValidatorModel并转换我的测试数据集

这样做时,我不再遇到任何问题。