机器学习多分类:为什么要使用' one-hot'编码而不是数字

时间:2017-06-26 12:44:27

标签: machine-learning tensorflow classification multiclass-classification

我目前正在研究tensorflow的分类问题,而且我是机器学习领域的新手,但我没有得到什么。

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

y = [0,0,1,0]

但我无法理解它背后的原理......

为什么不将相同的模型训练为输出类y = 3y = 4

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

我错过了什么?

3 个答案:

答案 0 :(得分:2)

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

这样的东西

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

  1. 如何解释输出y=1.5
  2. 为什么我尝试使用回归这样的数字,比如我正在处理连续数据,而实际上我正在使用离散数据?
  3. 事实上,你在做什么是将多类分类问题视为回归问题。 这是本地错误的(除非您正在进行二进制分类,在这种情况下,正输出和负输出都是您需要的一切)。

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

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

    这个,input=dog每个1, 0, 0都有tf.argmax作为输出等等。

    通过这种方式,您可以正确处理离散分类问题,产生离散输出并且可以很好地解释(事实上,您总是使用import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import spline data = np.loadtxt('surging_data.txt', delimiter=',') x1=data[0:3,0] y1=data[0:3,1] x2=data[3:6,0] y2=data[3:6,1] x1_smooth = np.linspace(x1.min(),x1.max(),100) y1_smooth = spline(x1,y1, x1_smooth) x2_smooth = np.linspace(x2.min(),x2.max(),100) y2_smooth = spline(x2,y2, x2_smooth) plt.plot(x1_smooth,y1_smooth, marker= 'o',linestyle='solid', label='Exp 8-10') plt.plot(x2_smooth,y2_smooth, marker='*', linestyle='solid', label='Exp 12-14') 提取具有最高激活率的输出神经元,即使您的网络没有学会制作完美的单热编码,您也能够毫无疑问地提取最可能正确的输出)

答案 1 :(得分:1)

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

尝试训练单个值将意味着不存在的类别ID之间存在线性关系:对于真实值y=4,输出y=3将被视为优于y=1即使类别是随机的,也可能是1: dogs, 3: cars, 4: cats

答案 2 :(得分:1)

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

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

相反,我们依靠连续的损失函数。此丢失函数通常基于与每个标签的概率或多或少相关的内容 - 为此,您需要一个每个标签具有一个值的网络输出。

通常,通过获取这些伪概率的argmax,可以从这个软连续输出中推导出您描述的输出。