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