Spark MLlib 中的 StringIndexer

StringIndexer in Spark MLlib

我的 PipelinedRDD 中有一列标称值,我想将其转换为索引编码以用于分类目的。

我曾经在pyspark.ml中使用StringIndexer,非常好用。然而,这次我正在学习如何处理 rdd 而不是数据帧,pyspark.mllib.

中没有这样的东西

感谢任何帮助。

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]))