【问题标题】:StringIndexer in Spark MLlibSpark MLlib 中的字符串索引器
【发布时间】:2018-07-24 13:31:18
【问题描述】:

我的PipelinedRDD 中有一列名义值,我想将其转换为索引编码以进行分类。

我以前在pyspark.ml 中使用过StringIndexer,非常好用。不过这次是学习如何处理rdd而不是dataframe,而pyspark.mllib中没有这种东西。

感谢任何帮助。

【问题讨论】:

  • 字符串索引器不适用于基于 RDD 的 API。但是,当 Dataframe 更快时,为什么还要将它用于 RDD 呢?

标签: python apache-spark pyspark rdd apache-spark-mllib


【解决方案1】:

Spark MLlib 中没有StringIndexer,因此您需要自己完成这项工作。首先收集该列的所有可能值并为每个值分配一个数字,将其保存为字典。然后,将其应用于原始 rdd 值。

下面的代码假设PipelinedRDD每行包含两个值,要转换的值在第一个位置(0):

dic = PipelinedRDD.map(lambda x: x[0]).distinct().zipWithIndex().collectAsMap()
PipelinedRDD = PipelinedRDD.map(lambda x: (dic[x[0]], x[1]))

注意:这与 StringIndexer 的 Spark 实现略有不同,因为它没有考虑值的频率(Spark 将 0 分配给出现最多的值,然后是 1 和很快)。但是,在大多数情况下,分配不同字符串的索引是无关紧要的。


扩展 如果您想准确地模仿 StringIndexer 的功能,如上面的注释中所述,可以稍微修改代码以考虑到这一点

dic = PiplelinedRDD.groupBy('cat_column').count().sort(col("count").desc()).map(lambda x: x[0]).zipWithIndex().collectAsMap()
PipelinedRDD = PipelinedRDD.map(lambda x: (dic[x[0]], x[1]))

【讨论】:

  • 字符串索引器在索引字符串变量之前使用频率分布?你为什么拒绝编辑
  • @pratiklodha:我更喜欢更简单的解决方案,因为在大多数情况下,哪个索引分配给哪些字符串不感兴趣(在有关它的答案中添加了注释)。但是,也许可以将其添加为答案的扩展或新答案。
猜你喜欢
  • 2018-05-20
  • 2019-11-12
  • 2016-10-01
  • 2016-02-11
  • 2018-11-04
  • 2016-10-12
  • 2015-02-04
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多