为啥要用one-hot编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥要用one-hot编码相关的知识,希望对你有一定的参考价值。

参考技术A 将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。

机器学习多分类:为啥使用“one-hot”编码而不是数字

【中文标题】机器学习多分类:为啥使用“one-hot”编码而不是数字【英文标题】:Machine learning multi-classification: Why use 'one-hot' encoding instead of a number机器学习多分类:为什么使用“one-hot”编码而不是数字 【发布时间】:2017-11-29 07:32:14 【问题描述】:

我目前正在研究 tensorflow 的分类问题,我是机器学习领域的新手,但我什么都不懂。

我已成功尝试训练输出y 张量的模型,如下所示:

y = [0,0,1,0]

但是看不懂背后的原理……

为什么不只训练相同的模型来输出诸如y = 3y = 4 之类的类

这似乎更灵活,因为我可以想象有 200 万个可能的类的多分类问题,输出 0-2,000,000 之间的数字比为每个输出 2,000,000 个项目的张量更有效结果。

我错过了什么?

【问题讨论】:

你只需要设置一个位来分类,如果你考虑你的输出层只有一个功能应该激活,其他的都是0。onehot经常用于fpga的状态编码更快速、更安全地标记内容 【参考方案1】:

答案在于如何计算最终张量或单个值。在 NN 中,您的 y=3 将通过对前一层的值进行加权求和来构建。

尝试针对单个值进行训练将暗示类别 ID 之间存在线性关系,其中不存在类别 ID:对于真实值 y=4,即使类别是随机的,输出 y=3 也会被认为优于 y=1 , 并且可能是1: dogs, 3: cars, 4: cats

【讨论】:

【参考方案2】:

理想情况下,您可以训练模型对输入实例进行分类并生成单个输出。类似的东西

y=1 表示input=dogy=2 表示input=airplane。然而,这样的方法会带来很多问题:

    如何解释输出y=1.5? 为什么我尝试回归一个数字,就像我在处理连续数据一样,而实际上我在处理离散数据?

实际上,您正在做的是将多类分类问题视为回归问题。 这是局部错误的(除非您进行二元分类,在这种情况下,正负输出就是您所需要的一切)。

为避免这些(和其他)问题,我们使用最后一层神经元,并将高激活与正确的类相关联。

one-hot 编码表示您希望在存在特定输入时强制网络具有单个高激活输出。

这样,每个input=dog 都会有1, 0, 0 作为输出等等。

通过这种方式,您可以正确处理离散分类问题,产生离散输出并且可以很好地解释(事实上,您将始终使用tf.argmax 提取具有最高激活的输出神经元,即使您的网络没有' t 学会了生成完美的 one-hot 编码,您将能够毫无疑问地提取最有可能正确的输出)

【讨论】:

【参考方案3】:

神经网络使用梯度下降来优化损失函数。反过来,这个损失函数需要是可微的。

离散输出将(确实是)分类网络的完全有效且有价值的输出。问题是,我们不知道如何有效地优化这个网络。

相反,我们依赖于连续损失函数。这种损失函数通常基于与每个标签的概率或多或少相关的东西——为此,您需要一个每个标签都有一个值的网络输出。

通常情况下,您描述的输出是通过这些伪概率的 argmax 从这个软的、连续的输出推导出来的。

【讨论】:

以上是关于为啥要用one-hot编码的主要内容,如果未能解决你的问题,请参考以下文章

机器学习离散型特征为什么要用One-Hot编码?

如何用pandas将某列one-hot编码后,修改原dataframe

独热编码(one-hot)是什么?什么数据类型需要进行独热编码?pandas如何进行独热编码(one-hot)?

机器学习中为什么使用one-hot编码

类别的one-hot编码

机器学习入门-数据预处理-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码)