【问题标题】:How to use StringIndexer to generate numeric variables?如何使用 StringIndexer 生成数值变量?
【发布时间】:2017-04-13 02:30:38
【问题描述】:

我希望使用StringIndexer 对我的数据集中的 1000 多个类别进行排名,生成一个表示相对频率的索引。然后我可以将此索引用作我的模型的数字特征。不幸的是,StringIndex 默认存储一些元数据,将索引标记为分类,迫使我的模型将索引用作category variable

有什么方法可以禁用这个,所以索引变量可以用作数值变量吗?

编辑:我使用字符串索引器作为 ML 管道中的一个阶段,因此解决方案需要避免直接操作数据框。此外,我将保存和加载此管道,因此自定义数据转换器可能不切实际。我怀疑这是不可能的,因为目前正在编写 Spark。

【问题讨论】:

    标签: apache-spark apache-spark-mllib apache-spark-ml


    【解决方案1】:

    您可以索引数据,然后替换元数据。假设您的数据如下所示:

    import spark.implicits._
    import org.apache.spark.ml.feature.StringIndexer
    
    val indexer = new StringIndexer().setInputCol("raw").setOutputCol("indexed")
    
    val df = Seq("a", "b", "b", "c", "c", "c").toDF("raw")
    val indexed = indexer.fit(df).transform(df)
    

    我们需要NumericAttribute:

    import org.apache.spark.ml.attribute.NumericAttribute
    

    和元数据:

    val meta = NumericAttribute.defaultAttr.withName("indexed").toMetadata
    

    最后我们可以使用as方法替换元数据:

    indexed.withColumn("indexed", $"indexed".as("indexed", meta))
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 2021-05-10
      • 2017-07-12
      • 2023-02-07
      • 2017-05-17
      • 2017-08-16
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      相关资源
      最近更新 更多