Java Spark:在分类数据的情况下为 aprroxNearestNeighbor 创建键向量

Java Spark: Creation of key vector for aprroxNearestNeighbor in case of categorical data

我正在尝试为分类数据集寻找近似最近邻。 为此,我使用了 Spark 中的 MinHashLSH 模型。

我的数据集包含分类数据。所以我使用 StringIndexer 后跟 OneHotEncoderEstimator 后跟 VectorAssembler 将分类值转换为连续值。

现在我想从我的数据集中找到给定键的最近邻居,这个键应该是矢量形式。我找不到将分类键转换为连续向量的方法。

List<Row> dataA = Arrays.asList(RowFactory.create(0, "apple"),
            RowFactory.create(1, "banana"),
            RowFactory.create(2, "coconut"));

StructType schema = new StructType(
            new StructField[] { new StructField("id", DataTypes.IntegerType, false, Metadata.empty()),
                    new StructField("fruits", DataTypes.StringType, false, Metadata.empty()) });
Dataset<Row> dfA = spark.createDataFrame(dataA, schema);
StringIndexer stringIndexer = new StringIndexer().setInputCol("fruits").setOutputCol("fruitIndex").setHandleInvalid("keep");
OneHotEncoderEstimator  encoder = new OneHotEncoderEstimator().setInputCols(new String[]{"fruitIndex"}).setOutputCols(new String[]{"fruitVec"});
String[] featuredCols = new String[] {"fruitIndex","fruitVec"};
VectorAssembler assembler = new VectorAssembler().setInputCols(featuredCols).setOutputCol("features");

Pipeline sovPipeline = new Pipeline().setStages(new PipelineStage[]{stringIndexer, encoder, assembler}); 
    //  Feature Transformation
PipelineModel plModel = sovPipeline.fit(dfA);
Dataset<Row> dfT = plModel.transform(dfA);
MinHashLSH mh = new MinHashLSH().setNumHashTables(5).setInputCol("features").setOutputCol("hashes");
MinHashLSHModel model = mh.fit(dfT);
// model.approxNearestNeighbors(dfT, key, 2).show();

如何从分类键为 approxNearestNeighbors 方法创建 key(数值连续向量)?

您使用的Vector应该使用与训练数据相同的方法进行转换。由于 Pipeline 模型无法处理单个项目,因此最快的解决方案是使用单个项目 Dataset:

import org.apache.spark.ml.linalg.Vector;

Vector key = plModel.transform(spark.createDataFrame(Arrays.asList(
    RowFactory.create(0, "some key")), schema
)).first().getAs("features");