gpt4 book ai didi

python - 保留索引-字符串对应关系 spark 字符串索引器

转载 作者:太空狗 更新时间:2023-10-29 17:32:20 25 4
gpt4 key购买 nike

Spark 的 StringIndexer 非常有用,但通常需要检索生成的索引值与原始字符串之间的对应关系,并且似乎应该有一种内置的方法来完成此操作。我将使用 Spark documentation 中的这个简单示例进行说明:

from pyspark.ml.feature import StringIndexer

df = sqlContext.createDataFrame(
[(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c")],
["id", "category"])
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
indexed_df = indexer.fit(df).transform(df)

这个简化的案例给了我们:

+---+--------+-------------+
| id|category|categoryIndex|
+---+--------+-------------+
| 0| a| 0.0|
| 1| b| 2.0|
| 2| c| 1.0|
| 3| a| 0.0|
| 4| a| 0.0|
| 5| c| 1.0|
+---+--------+-------------+

一切都很好,但对于许多用例,我想知道我的原始字符串和索引标签之间的映射。我能想到的最简单的方法是这样的:

   In [8]: indexed.select('category','categoryIndex').distinct().show()
+--------+-------------+
|category|categoryIndex|
+--------+-------------+
| b| 2.0|
| c| 1.0|
| a| 0.0|
+--------+-------------+

如果需要,我可以将结果存储为字典或类似的:

In [12]: mapping = {row.categoryIndex:row.category for row in
indexed.select('category','categoryIndex').distinct().collect()}

In [13]: mapping
Out[13]: {0.0: u'a', 1.0: u'c', 2.0: u'b'}

我的问题是:因为这是一项很常见的任务,而且我猜测(但当然可能是错误的)字符串索引器以某种方式存储了这个映射,有没有办法完成上述任务简单地?

我的解决方案或多或少简单明了,但对于大型数据结构,这涉及大量我(也许)可以避免的额外计算。想法?

最佳答案

可以从列元数据中提取标签映射:

meta = [
f.metadata for f in indexed_df.schema.fields if f.name == "categoryIndex"
]
meta[0]
## {'ml_attr': {'name': 'category', 'type': 'nominal', 'vals': ['a', 'c', 'b']}}

其中 ml_attr.vals 提供位置和标签之间的映射:

dict(enumerate(meta[0]["ml_attr"]["vals"]))
## {0: 'a', 1: 'c', 2: 'b'}

Spark 1.6+

您可以使用 IndexToString 将数值转换为标签。这将使用如上所示的列元数据。

from pyspark.ml.feature import IndexToString

idx_to_string = IndexToString(
inputCol="categoryIndex", outputCol="categoryValue")

idx_to_string.transform(indexed_df).drop("id").distinct().show()
## +--------+-------------+-------------+
## |category|categoryIndex|categoryValue|
## +--------+-------------+-------------+
## | b| 2.0| b|
## | a| 0.0| a|
## | c| 1.0| c|
## +--------+-------------+-------------+

Spark <= 1.5

这是一个肮脏的 hack,但你可以简单地从 Java 索引器中提取标签,如下所示:

from pyspark.ml.feature import StringIndexerModel

# A simple monkey patch so we don't have to _call_java later
def labels(self):
return self._call_java("labels")

StringIndexerModel.labels = labels

# Fit indexer model
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex").fit(df)

# Extract mapping
mapping = dict(enumerate(indexer.labels()))
mapping
## {0: 'a', 1: 'c', 2: 'b'}

关于python - 保留索引-字符串对应关系 spark 字符串索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33636944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com