我正在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
该代码实际上正在使用相同大小的数据集。因此,我想知道是否可以将保存的模型与另一个具有不同大小的数据集一起使用,而无需再次进行拟合。如果是这样,我想知道如何。
谢谢您的帮助。
答案 0 :(得分:0)
我实际上找到了此错误的原因。在我的一个热编码过程中,实际上我使用的是一些我没有保存的管道,例如CrossValidatorModel。我要做的是:
这样做时,我不再遇到任何问题。