对于有序特征,使用标签编码是有意义的。但是对于分类特征,我们使用独热编码。但这些是输入特征的惯例。对于输出变量,如果输出标签是分类性的,是否有必要使用独热编码?还是我也可以使用标签编码?哪一种更可取?
我正在训练一个有120个类别的水果分类器。我使用在ImageNet上预训练的ResNet50模型作为特征提取器,并使用这些特征来训练一个逻辑回归分类器(迁移学习)。由于有120个类别,标签编码的标签将从0到119。如果保持它们为标签编码来训练模型,这样做可以吗?我问这个问题是因为在以下sklearn的文档中,他们允许我这样做:
sklearn.preprocessing.LabelEncoder
在这里他们说:
…”这个转换器应该用于编码目标值,即y,而不是输入X。”
但我感到困惑,为什么这样做是可以的,因为在标签编码中,每个输出变量不会像使用独热编码那样获得相同的优先级。
回答:
对于输出变量,如果输出标签是分类性的,是否有必要使用独热编码?
不,这不是必要的,在你的情况下也不会有影响。另一方面,并不是所有算法都能以非独热编码的方式返回数据:
RandomForest
可以使用标签编码进行分类,因为它只是基于内部的类似if的条件(简化)返回N个目标值中的一个。- ResNet50,作为一个神经网络,将返回矩阵
[samples, labels]
,带有logits(未归一化的概率)或概率,以此计算损失。它不能返回像[0, 2, 18, 25]
(对于4个样本)这样的值,因为像argmax
这样的操作会破坏梯度(它是沿着列取的,以在计算像准确率这样的指标时获得标签的索引,但我不会认为这是网络的一部分)。
尽管如此,许多框架允许你将标签编码为有序的,因为这样更节省内存。你可以查看PyTorch的 torch.nn.CrossEntropyLoss
,它接受以有序值保存的目标。
正如评论中指出的,这两种都是标签的编码方式,并且可以根据需要轻松转换。