【问题标题】:Is label encoding enough for output labels?标签编码是否足以用于输出标签?
【发布时间】:2020-08-27 08:14:09
【问题描述】:

对于序数特征,使用标签编码是有意义的。但是对于分类特征,我们使用一种热编码。但这些是输入特征的约定。但是对于输出变量,如果输出标签是分类的,是否有必要使用一种热编码?或者我也可以使用标签编码?哪一个更可取?

我正在训练一个有 120 个类别的水果分类器。我使用在 ImageNet 上预训练的 ResNet50 模型作为特征提取器,并使用这些特征训练逻辑回归分类器(迁移学习)。由于有 120 个类,对于标签编码,标签的范围从 0 到 119。训练模型保持标签编码是否可以?我之所以这样问,是因为在 sklearn 的以下文档中,他们允许我这样做:

sklearn.preprocessing.LabelEncoder

他们在说:

..."这个转换器应该用于编码目标值,即 y,而不是输入 X。"

但我很困惑为什么这样做是可以的,因为在标签编码中每个输出变量都没有获得与我使用一种热编码时相同的优先级。

【问题讨论】:

  • One Hot 是标签编码器的一个选项
  • 请注意,在序数特征上使用 LabelEncoder 也不是一个好主意,您需要一个 OrdinalEncoder。标签编码器只能在目标上使用,请参阅here

标签: machine-learning scikit-learn logistic-regression one-hot-encoding label-encoding


【解决方案1】:

但是对于输出变量是否有必要使用一种热编码,如果 输出标签是分类的?

不,这不是必需的,对您的情况也无关紧要。另一方面,并​​非所有算法都能以非热编码方式返回数据:

  • RandomForest 可以使用标签编码进行分类,因为它“只是”根据内部类似 if 的条件返回 N 个目标值之一(简化)。
  • ResNet50,因为它是一个神经网络,将返回矩阵[samples, labels] 与 logits(非标准化概率)或计算损失的概率。它无法返回像 [0, 2, 18, 25] (对于 4 个样本)这样的值,因为像 argmax 这样的操作会破坏梯度(在计算精度等内容时,它会沿着列获取标签的索引,但我不会认为它是网络)。

仍有许多框架允许您将标签编码为序数,因为它更节省内存。你可以看到 PyTorch 的torch.nn.CrossEntropyLoss,它接收保存为序数值的目标。

正如 cmets 中所指出的,两者都是标签的编码,可以根据需要轻松传输。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多