【问题标题】:How to reverse one hot encoded value to Label?如何将一个热编码值反转为标签?
【发布时间】:2019-05-22 16:22:27
【问题描述】:

我正在研究简单的数据集来检测类名为“R”和“M”的岩石或地雷。我有一个热编码的 R 到 1 和 M 到 0。现在我想修改它。

我尝试了很多方法,但找不到将 1 转换回 R 和 0 转换回 M 的方法

import numpy as np
import pandas as pd
import keras
from sklearn.preprocessing import LabelEncoder

df=pd.read_csv('D:\\Datasets\\node-fussy-examples-master\\node-fussy- 
examples-master\\sonar\\training.csv')
ds=df.values
x_train=df[df.columns[0:60]].values
y_train=df[df.columns[60]]

encoder = LabelEncoder()
encoder.fit(y_train)
encoded_Y = encoder.transform(y_train)

我希望 1 是 R,0 是 M

【问题讨论】:

    标签: keras one-hot-encoding


    【解决方案1】:

    你可以使用inverse_transform方法:

    from sklearn import preprocessing
    le = preprocessing.LabelEncoder()
    le.fit([1, 2, 2, 6])
    print(le.transform([1, 1, 2, 6]))
    print(le.inverse_transform([0, 0, 1, 2]))
    

    如果您需要在 Tensorflow 中做同样的事情,请查看 this thread

    【讨论】:

      【解决方案2】:

      我今天刚刚遇到一个用例,我需要将 onehot 编码的张量转换回正常的标签张量。我知道你可以使用np.argmax(probs, axis=1) 或其他东西来反转一个热编码的概率张量,但这在我的情况下不起作用,因为我的数据不是软概率张量,而是一个填充了 0 或 1 的标签张量。我知道这与 OP 的问题并不完全相关,但我认为有人可能需要做类似的事情,所以我将在这里写下我的解决方案。

      def reverse_onehot(onehot_data):
          # onehot_data assumed to be channel last
          data_copy = np.zeros(onehot_data.shape[:-1])
          for c in range(onehot_data.shape[-1]):
              img_c = onehot_data[..., c]
              data_copy[img_c == 1] = c
          return data_copy
      

      【讨论】:

        【解决方案3】:

        假设y 是您的单热编码数组。那么下面应该给你标签:

        unique_classes[np.argmax(y, axis=1)]

        假设您也使用unique_classes 进行编码(顺序很重要)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-18
          • 2018-04-18
          相关资源
          最近更新 更多