【问题标题】: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))