【问题标题】:Use One-Hot encoding for few categories for one row对一行的几个类别使用 One-Hot 编码
【发布时间】:2021-04-22 02:34:20
【问题描述】:

我有这样的分类数据集:

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

因此,只需忽略 Color 列,并为 Sequential 模型制作少量输出。

但是这不是和将Red,Green 转换成[0. 1. 1.] 完全一样吗?

我感觉我错过了一些明显的东西,如果我的问题很愚蠢,对不起。

【问题讨论】:

    标签: python neural-network one-hot-encoding


    【解决方案1】:

    在您的情况下,最好使用来自sklearnMultiLabelBinarizer。如果df 是包含数据集数据的数据框,则可以执行以下操作:

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

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

    【讨论】:

      【解决方案2】:

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

      001 blue
      010 red
      011 green
      100 blue red
      

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-06-21
        • 2020-08-27
        • 2021-02-23
        • 2020-09-18
        • 2020-06-23
        • 2017-11-06
        • 1970-01-01
        • 2018-05-22
        • 2020-03-18
        相关资源
        最近更新 更多