python—使用pyspark进行热编码的最有效方法

wwodge7n  于 2021-05-17  发布在  Spark
关注(0)|答案(0)|浏览(513)

我想一个热编码多个分类功能使用 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 .
在我花上数小时/数天来实现它、等待结果、调试等之前,我想问一下是否有人对此有任何经验?有没有一个有效的方法我错过了?如果不是的话,三个人中哪一个可能最快?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题