如何使用 VectorAssembler 设置 spark 数据集的 n 个特征?

问题描述

我正在尝试在包含 n 列未标记双精度值的矩阵上运行 PCA。我的代码是:

    SparkSession spark = SparkSession
        .builder()
        .appName("JavaPCAExample")
        .getorCreate();

    Dataset<Row> data = spark.read().format("csv")
        .option("sep",",")
        .option("inferSchema","true")
        .option("header","False")
        .load("testInput/matrix.csv");

    PCAModel pca = new PCA()
//      .setInputCol("features")
//      .setoutputCol("pcaFeatures")
        .setK(3)
        .fit(data);

    Dataset<Row> result = pca.transform(data).select("pcaFeatures");
    result.show(true);

    spark.stop();

运行此结果会导致“java.lang.IllegalArgumentException:字段“功能”不存在。”例外。我找到了帖子: How to merge multiple feature vectors in DataFrame?

How to work with Java Apache Spark MLlib when DataFrame has columns?

这让我看到了 VectorAssembler 文档: https://spark.apache.org/docs/latest/ml-features.html#vectorassembler

在这些示例中的每一个中,标记的列标题都被手动添加功能。我一直无法弄清楚如何使用 VectorAssembler 将所有 n标记的列转换为特征。任何见解将不胜感激。谢谢

解决方法

找到 .columns() 函数

    SparkSession spark = SparkSession
        .builder()
        .appName("JavaPCAExample")
        .getOrCreate();

    Dataset<Row> data = spark.read().format("csv")
        .option("sep",",")
        .option("inferSchema","true")
        .option("header","False")
        .load("testInput/matrix.csv");
    
    
    VectorAssembler assembler = new VectorAssembler()
        .setInputCols(data.columns())
        .setOutputCol("features");

    Dataset<Row> output = assembler.transform(data);

    PCAModel pca = new PCA()
        .setInputCol("features")
        .setOutputCol("pcaFeatures")
        .setK(5)
        .fit(output);