在pyspark中聚合One-Hot编码功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在pyspark中聚合One-Hot编码功能相关的知识,希望对你有一定的参考价值。
我在python方面很有经验但对pyspark来说却是全新的。我的数据框包含大约50M行,具有几个分类功能。对于每个功能,我都有One-Hot编码。这是代码的简化但有代表性的示例。
来自pyspark.ml.feature导入StringIndexer,来自pyspark.ml的OneHotEncoder导入管道
df = sc.parallelize([
(1, 'grocery'),
(1, 'drinks'),
(1, 'bakery'),
(2, 'grocery'),
(3, 'bakery'),
(3, 'bakery'),
]).toDF(["id", "category"])
indexer = StringIndexer(inputCol='category', outputCol='categoryIndex')
encoder = OneHotEncoder(inputCol='categoryIndex', outputCol='categoryVec')
pipe = Pipeline(stages = [indexer, encoder])
newDF = pipe.fit(df).transform(df)
给出输出
+---+--------+-------------+-------------+
| id|category|categoryIndex| categoryVec|
+---+--------+-------------+-------------+
| 1| grocery| 1.0|(2,[1],[1.0])|
| 1| drinks| 2.0| (2,[],[])|
| 1| bakery| 0.0|(2,[0],[1.0])|
| 2| grocery| 1.0|(2,[1],[1.0])|
| 3| bakery| 0.0|(2,[0],[1.0])|
| 3| bakery| 0.0|(2,[0],[1.0])|
+---+--------+-------------+-------------+
我现在想将group'y'id'和'categoryVec'列合并为一个总和,因此我可以为每个id获取一行,其中一个向量指示客户正在购买哪个(可能是几个)类别。在pandas中这只是对pd.get_dummies()
步骤中生成的每个列应用sum / mean的情况,但这里似乎并不那么简单。
然后我将输出传递给ML算法,因此我需要能够在输出上使用VectorAssembler或类似物。
哦,我真的需要一个pyspark解决方案。
非常感谢您的帮助!
答案
您可以使用Countvectorizer。它将类别索引数组转换为编码矢量。
from pyspark.ml.feature import CountVectorizer
from pyspark.ml import Pipeline
from pyspark.sql.window import Window
from pyspark.sql import functions as F
df = sc.parallelize([
(1, 'grocery'),
(1, 'drinks'),
(1, 'bakery'),
(2, 'grocery'),
(3, 'bakery'),
(3, 'bakery'),
]).toDF(["id", "category"])
.groupBy('id')
.agg(F.collect_list('category').alias('categoryIndexes'))
cv = CountVectorizer(inputCol='categoryIndexes', outputCol='categoryVec')
transformed_df = cv.fit(df).transform(df)
transformed_df.show()
结果:
+---+--------------------+--------------------+
| id| categoryIndexes| categoryVec|
+---+--------------------+--------------------+
| 1|[grocery, drinks,...|(3,[0,1,2],[1.0,1...|
| 3| [bakery, bakery]| (3,[0],[2.0])|
| 2| [grocery]| (3,[1],[1.0])|
+---+--------------------+--------------------+
以上是关于在pyspark中聚合One-Hot编码功能的主要内容,如果未能解决你的问题,请参考以下文章