【问题标题】:One Hot Encoding a composite field一个热编码复合字段
【发布时间】:2018-12-09 15:36:18
【问题描述】:

我想使用OneHotEncoder 转换具有相同分类值的多个列。我创建了一个复合字段并尝试在其上使用OneHotEncoder,如下所示:(项目 1-3 来自同一个项目列表)

import pyspark.sql.functions as F

df = df.withColumn("basket", myConcat("item1", "item2", "item3")) 
indexer = StringIndexer(inputCol="basket", outputCol="basketIndex")
indexed = indexer.fit(df).transform(df)
encoder = OneHotEncoder(setInputCol="basketIndex", setOutputCol="basketVec")

encoded = encoder.transform(indexed)

def myConcat(*cols):
    return F.concat(*[F.coalesce(c, F.lit("*")) for c in cols])

我收到一个内存不足错误

这种方法有效吗?如何使用同一列表中的分类值对复合字段或多列进行热编码?

【问题讨论】:

    标签: apache-spark pyspark one-hot-encoding multivalue


    【解决方案1】:

    如果您有分类值数组,为什么不尝试 CountVectorizer:

    import pyspark.sql.functions as F
    from pyspark.ml.feature import CountVectorizer
    
    df = df.withColumn("basket", myConcat("item1", "item2", "item3")) 
    indexer = CountVectorizer(inputCol="basket", outputCol="basketIndex")
    indexed = indexer.fit(df).transform(df)
    

    【讨论】:

    • 谢谢。我不知道 CountVectorizer。将尽快尝试并在此处发布结果。
    • CountVectorizer 工作!谢谢。我不得不使用 F.array 而不是 myConcat:df = df.withColumn("basket", F.array("item1", "item2", "item3")) 现在,OneHotEncoder 正在抛出:Input column must be of type NumericType but got org.apache.spark.ml.linalg.Vector一种对向量进行 OneHotEncode 的方法。抱歉,我还没看说明书。感谢您的宝贵时间!
    • 使用countvectorizer后,我认为不需要onehotencoding。它们都生成向量。
    【解决方案2】:

    注意:我还不能发表评论(因为我是新用户)。

    你的“item1”、“item2”和“item3”的基数是多少

    更具体地说,以下打印给出的值是什么?

    k1 = df.item1.nunique()
    k2 = df.item2.nunique()
    k3 = df.item3.nunique()
    k = k1 * k2 * k3
    print (k1, k2, k3)
    

    一种热编码基本上是创建一个与原始数据帧具有相同行数的非常稀疏的矩阵,其中包含 k 个附加列,其中 k = 上面打印的三个数字的乘积。

    因此,如果您的 3 个数字很大,则会出现内存不足错误。

    唯一的解决办法是:

    (1) 增加你的记忆力或 (2)在类别之间引入层次结构,并使用更高级别的类别来限制k。

    【讨论】:

    • 谢谢。 k1 = k2 = k3 大约为 2000,记录数约为 250,000。我增加了内存,但没有用。但是,我对自己的方法没有信心。
    猜你喜欢
    • 2019-12-03
    • 2019-08-09
    • 2016-07-04
    • 2023-03-18
    • 2020-08-12
    • 1970-01-01
    • 2019-07-06
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多