对一行的几个类别使用 One-Hot 编码

Use One-Hot encoding for few categories for one row

我有这样的分类数据集:

Name Color (Category)
Car Red
Grass Green
Sky Blue
Apple Red,Green
Photo Black,White

所以一行可以有一个或几个个类别。

此外,我还在为类别使用 OneHotEncoder:

data = asarray([['red'], ['green'], ['blue']])
print(data)
encoder = OneHotEncoder(sparse=False)
onehot = encoder.fit_transform(data)
print(onehot)

输出将是

[['red']
 ['green']
 ['blue']]
[[0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]

是否可以对两个或更多类别使用 OneHotEncoding?

喜欢 Red,Green 转换为 [0. 1. 1.]?

我正在阅读 OneHotEncodertensorflow.keras.utils.to_categorical 文档,但找不到这样的解决方案。

另一个解决方案

我在某处遇到意见,我需要将我的逻辑更改为:

Name Color (Category) (Remove) Red Green Blue Black White
Car //Red True False False False False
Grass //Green False True False False False
Sky //Blue False False True False False
Apple //Red,Green True True False False False
Photo //Black,White False False False True True

因此只需忽略 颜色 列,并为顺序模型进行少量输出。

但是把Red,Green转成[0. 1. 1.]不就完全一样了吗?

我觉得我漏掉了一些明显的东西,如果我的问题很愚蠢,抱歉。

在你的情况下,最好使用 sklearn 中的 MultiLabelBinarizer。如果 df 是包含数据集数据的数据框,您可以这样做:

mlb = MultiLabelBinarizer()
mlb.fit_transform(df["Color (Category)"].str.split(","))

Link 到 sklearn 文档:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html

一个热编码名称来自单个高位,其他都是低位。所以如果你将它编码为 011 它就不再是一种热编码了。 有一种二进制编码方法,但在那种情况下,如果你像这样随机编码

001 blue
010 red
011 green
100 blue red

那么这个场景就会有问题,因为红色和绿色会共享第二个位,它们会在整个训练过程中相互影响。

因此,为了安排这些共享位以促进学习,您展示的 table 是解决此问题的合乎逻辑的方法,如下所示

    001 blue
    010 red
    100 green
    110 green red
    111 green blue red