【发布时间】:2018-11-27 12:41:53
【问题描述】:
我正在使用 Spark (core/mlib) 和 Java,版本 2.3.1。
我正在对数据集应用三个转换 - StringIndexer、OneHotEncoderEstimator、VectorAssember - 这是为了将我的数据集中的分类变量转换为每个类别的 1 和 0 的单独列。在我的火车数据上,这种转换没有问题,一切都符合预期,我正在将此模型保存到文件中。
当我尝试在新数据点上使用此模型时出现问题:
public static double loadModel(Obj newData) {
SparkSession spark = Shots.buildSession();
//Function which applies transformations
Dataset<Row> data = buildDataset(spark, Arrays.asList(newData));
LogisticRegressionModel lrModel = LogisticRegressionModel.load(modelPath);
//Error is thrown here as the model doesn't seem to understand the input
Dataset<Row> preds = lrModel.transform(data);
preds.show();
}
我认为,问题在于转换现在仅应用于一行数据,该数据仅输出一个类别的分类特征和一个转换后只有一个元素的向量。当应用 LogisticRegressionModel 变换时,这会导致错误,这需要一个长度大于该特征的向量......我认为。
我知道我的错误是不知道如何将火车变换应用于新数据...但我不确定错误到底在哪里,因此不知道在哪里可以找到答案(是问题所在保存模型后,我是否需要保存其他东西,例如管道等)。
实际抛出的错误是 -
java.lang.IllegalArgumentException: requirement failed: BLAS.dot(x: Vector, y:Vector) was given Vectors with non-matching sizes: x.size = 7, y.size = 2 - the reason why I have come to the conclusions above is a visual examination of the data.
一个例子可能有助于解释:我有一个具有 3 个值 [Yes, No, Maybe] 的分类特征。我的火车数据包含所有三个值,我最终得到一个长度为 3 的向量特征来表示类别。
然后我在单个数据点上使用相同的管道来预测一个值,但分类特征只能是 Yes、No 或 Maybe,因为只有一个数据点。因此,当您应用与上述相同的转换时,您最终会得到一个包含一个元素而不是三个元素的向量,从而导致模型转换引发错误。
【问题讨论】:
-
请发布完整的堆栈跟踪?
标签: apache-spark apache-spark-mllib