【问题标题】:Use a saved model to transform another data without fitting again Spark使用保存的模型来转换另一个数据而无需再次拟合 Spark
【发布时间】:2020-03-05 11:50:28
【问题描述】:

我正在使用带有 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

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

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    1. 用我的训练数据集拟合我的一个热门编码管道并将它们保存为模型
    2. 用我的训练数据集拟合我的 CrossValidator 并将其保存为模型
    3. 加载我的一个热门编码管道模型并转换我的测试数据集
    4. 加载我的 CrossValidatorModel 并转换我的测试数据集

    执行此操作时,我不再遇到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 2015-12-26
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2012-12-13
      相关资源
      最近更新 更多