【问题标题】:Correct way of one-hot-encoding class labels for multi-class problem多类问题一热编码类标签的正确方法
【发布时间】:2020-07-26 21:06:06
【问题描述】:

我有多个类的分类问题,我们称它们为 A、B、C 和 D。我的数据具有以下形状:

X=[#samples, #features, 1], y=[#samples,1].

更具体地说,y 看起来像这样:

[['A'], ['B'], ['D'], ['A'], ['C'], ...]

当我在这些标签上训练随机森林分类器时,效果很好,但是我多次阅读,类标签也需要是一个热编码的。 一次热编码后,y为

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

并且有形状

[#samples, 4]

当我尝试将其用作分类器输入时,就会出现问题。该模型分别预测四个标签中的每一个,这意味着它也能够产生像 [0 0 0 0] 这样的输出,这是我不想要的。 rfc.classes_返回

# [array([0, 1]), array([0, 1]), array([0, 1]), array([0, 1])]

我如何告诉模型标签是一个热编码而不是多个标签,这些标签应该相互独立地进行预测?我需要更改我的 y 还是需要更改模型的某些设置?

【问题讨论】:

    标签: python numpy machine-learning encoding multiclass-classification


    【解决方案1】:

    您最初的方法,没有一次性编码,正在做您想做的事情。

    单热编码适用于许多模型的输入,但仅用于少数模型的输出(例如,训练具有交叉熵损失的神经网络)。所以这些只是一些算法实现需要的,而其他的没有它也可以。

    对于输出标签,像 RandomForest 这样的分类器对字符串和多个类都很好。

    【讨论】:

      【解决方案2】:

      sklearn 中使用随机森林时,您不必进行一次热编码。

      你需要的是“标签编码器”,你的 Y 应该是这样的

      from sklearn.preprocessing import LabelEncoder
      y = ["A","B","D","A","C"]
      le = LabelEncoder()
      le.fit_transform(y)
      # array([0, 1, 3, 0, 2], dtype=int64)
      

      我尝试修改示例代码sklearn provided

      from sklearn.ensemble import RandomForestClassifier
      import numpy as np
      from sklearn.datasets import make_classification
      
      >>> X, y = make_classification(n_samples=1000, n_features=4,
      ...                            n_informative=2, n_redundant=0,
      ...                            random_state=0, shuffle=False)
      y = np.random.choice(["A","B","C","D"],1000)
      print(y.shape)
      >>> clf = RandomForestClassifier(max_depth=2, random_state=0)
      >>> clf.fit(X, y)
      >>> clf.classes_
      # array(['A', 'B', 'C', 'D'], dtype='<U1')
      

      无论是否使用标签编码处理 y,它都可以使用 RandomForestClassifier

      【讨论】:

      • 但是为什么使用 ['A' , 'B', ...] 的方法完全有效? sklearn 会自动编码字符串吗?
      • 是的,它将您的 y 视为分类。
      【解决方案3】:

      这里你不需要对标签进行编码,你可以保持原样,无论是字符串还是数字 据我所知,在使用神经网络时,您应该考虑一种热编码/标签编码 以 bbc 分类数据为例

      model.predict(sample_data)
      

      array(['entertainment'], dtype='

      对于训练集中的文本数据,必须进行一次热编码: 例如

          name         fuel type
      
          baleno         petrol
      
          MG hector      electric
      

      热编码后

        name         fuel type_petrol    fuel_type_electric
      
      
       baleno         1                       0
      
      
      MG hector      0                       1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 2019-03-31
        • 2020-09-25
        • 2023-03-06
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        相关资源
        最近更新 更多