我想一个热编码多个分类功能使用 pyspark
(版本2.3.2)。我的数据非常大(数百个特征,数百万行)。问题是皮斯帕克 OneHotEncoder
类将其结果作为一个向量列返回。我需要有一个单独的结果列每个类别。实现这一目标最有效的方法是什么?
方案1和2
如果你真的使用 OneHotEncoder
,问题是如何将一个向量列转换为单独的二进制列。在四处搜索时,我发现大多数其他答案似乎都使用了这个答案的某种变体,它给出了两个选项,这两个选项看起来都非常低效:
使用 udf
. 但是我想避免这种情况,因为udf本身就是低效的,特别是如果我必须对我想要的每个分类特性重复使用一个热编码。
转换为 rdd
. 然后为每一行提取所有值并附加一个热编码的特征。你可以在这里找到一个很好的例子:
def extract(row):
return tuple(map(lambda x: row[x], row.__fields__)) + tuple(row.c_idx_vec.toArray().tolist())
result = df.rdd.map(extract).toDF(allColNames)
问题是,这将提取每行的每个值,然后将其转换回Dataframe。如果您需要对具有数百个特性和数百万行的Dataframe执行此操作,尤其是如果您需要执行几十次,那么这听起来很可怕。
有没有另一种更有效的方法将向量列转换为我所缺少的独立列?如果不是,也许最好不要用 OneHotEncoder
因为我不能有效地使用结果。这让我想到了选项3。
方案3
选择3将只是一个热编码自己使用 reduce
声明和 withColumn
. 例如:
df = reduce(
lambda df, category: df.withColumn(category, sf.when(col('categoricalFeature') == category, sf.lit(1)))
categories,
df
)
哪里 categories
当然是功能中可能的类别列表 categoricalFeature
.
在我花上数小时/数天来实现它、等待结果、调试等之前,我想问一下是否有人对此有任何经验?有没有一个有效的方法我错过了?如果不是的话,三个人中哪一个可能最快?
暂无答案!
目前还没有任何答案,快来回答吧!