One Hot 编码复合字段
One Hot Encoding a composite field
我想使用 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])
我收到 内存不足错误。
这种方法行得通吗?我如何使用同一列表中的分类值对复合字段或多列进行热编码?
注意:我还不能发表评论(因为我是新用户)。
你的 "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。
如果你有分类值数组,为什么你没有尝试 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)
我想使用 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])
我收到 内存不足错误。
这种方法行得通吗?我如何使用同一列表中的分类值对复合字段或多列进行热编码?
注意:我还不能发表评论(因为我是新用户)。
你的 "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。
如果你有分类值数组,为什么你没有尝试 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)