二进制数而不是一个热向量

Binary numbers instead of one hot vectors

在进行逻辑回归时,通常的做法是使用一个热向量作为期望的结果。所以,no of classes = no of nodes in output layer。我们不使用词汇表中的单词索引(或一般的 class 数字),因为这可能会错误地指示两个 class 的接近度。但是为什么我们不能使用二进制数而不是单热向量呢?

即如果有 4 个 class,我们可以将每个 class 表示为 00,01,10,11,从而在输出层中产生 log(no of classes) 个节点。

用二进制编码就可以了。但是您可能需要根据您的任务和模型添加另一层(或过滤器)。因为由于二进制表示,您的编码现在涉及无效的共享功能。

例如,输入的二进制编码 (x = [x1, x2]):

'apple' = [0, 0]
'orange' = [0, 1]
'table' = [1, 0]
'chair' = [1, 1]

表示orangechair具有相同的特征x2。现在预测两个 类 y:

'fruit' = 0
'furniture' = 1

和标记数据样本的线性优化模型(W = [w1, w2] 和偏差 b):

(argmin W) Loss = y - (w1 * x1 + w2 * x2 + b)

每当您将 chairw2 权重更新为 furniture 时,您都会得到一个不受欢迎的更新,就好像将 orange 也预测为 furniture 一样。

在这种特殊情况下,如果您添加另一层 U = [u1, u2],您可能可以解决此问题:

(argmin U,W) Loss = y - (u1 * (w1 * x1 + w2 * x2 + b) +
                         u2 * (w1 * x1 + w2 * x2 + b) +
                         b2)

好的,为什么不通过使用单热编码来避免这种错误表示。 :)

https://github.com/scikit-learn-contrib/categorical-encoding

category_encoders 支持二进制编码(事实上,基本任何编码)。在我们的例子中,我们最终在二进制字符串中的每个位置都有一个特征,所以它不是一个具有值 '011' 或 '010' 的特征,它的 3 分别具有 [0, 1, 1] 和 [0, 1, 0]。