簡體   English   中英

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM