具有不同数量的特征实例的多特征 One-Hot-Encoder

数据挖掘 scikit-学习 编码 特征
2022-02-11 14:16:43

假设我们有这样的数据实例:

[
    [15, 20, ("banana","apple","cucumber"), ...],
    [91, 12, ("orange","banana"), ...],
    ...
]

我想知道如何编码这些数据点的第三个元素。对于多个特征值,我们可以使用 sklearn 的OneHotEncoder,但据我所知,它无法处理不同长度的输入。

这是我尝试过的:

X = [[15, 20, ("banana","apple","cucumber")], [91, 12, ("orange","banana")]]

ct = ColumnTransformer(
    [
        ("genre_encoder", OneHotEncoder(), [2])
    ],
    remainder='passthrough'
)
print(ct.fit_transform(X))

这只会输出

[[1.0 0.0 15 20]
 [0.0 1.0 91 12]]

正如预期的那样,因为元组被处理为可以表示此功能的可能值。

我们不能直接嵌入我们的特征(比如[15, 12, "banana", "apple", "cucumber"]),因为

  1. 我们不知道我们将拥有多少个此功能的实例(两个?三个?)
  2. 每个位置都将被解释为一个自己的特征,因此如果我们banana在一个数据点的第一个标称槽中,在第二个标称槽中的第二个,它们将不计入一个特征可以体现的相同“值池”

例子:

X = [["banana","apple","cucumber"], ["orange","banana", "cucumber"]]
enc = OneHotEncoder()
print(enc.fit_transform(X).toarray())

[[1. 0. 1. 0. 1.]
 [0. 1. 0. 1. 1.]]

此表示包含 5 个插槽而不是 4 个,因为第一个插槽被解释为使用bananaor orange,第二个插槽被解释为appleorbanana并且最后一个只有选项cucumber

(这也不能解决每个数据点具有不同数量的特征值的问题。并且用替换空的None也不能解决问题,因为这样会None面临这种位置模糊。)

知道如何编码那些可以采用多个值并由不同数量的元素组成的“Multi-Muliti”特征吗?先感谢您!

1个回答

我认为您可以将其转换为文本预处理问题,然后使用 CountVectorizer。您基本上通过将原始数据中的所有单词放在一起来构建“文档”,然后在这些文档上使用 CountVectorizer。

from sklearn.feature_extraction.text import CountVectorizer

X = [["banana","apple","cucumber"], ["orange","banana", "cucumber"]]
# Create documents
X_ = [' '.join(x) for x in X]
enc = CountVectorizer()
print(enc.fit_transform(X_).toarray())

退货

[[1 1 1 0]
 [0 1 1 1]]

如您所料,它有 4 个不同的值。