【问题标题】:nominal-value inputs for Neural Network神经网络的标称值输入
【发布时间】:2019-07-31 21:41:06
【问题描述】:
我有一组训练数据,这组数据中的每个项目由 4 个数值和 1 个标称值组成,标称值是计算这些值的方法的名称。 (有8种方法)
我正在用这些训练神经网络。为了摆脱名义值,我简单地为每种方法分配了一个 1 到 8 的值,并使用一个输入将其传递给神经网络,并使用其他 4 个输入作为数值。这是一种工作,但结果并不像我想要的那么惊人。
所以我的问题是,这可能是因为将数字简单地分配给名义值吗?或者可能是因为混合了两种不同类别的输入,它们并不真正处于同一级别(数字和方法类型)
【问题讨论】:
标签:
artificial-intelligence
machine-learning
neural-network
【解决方案1】:
一般来说,对标称值进行编码的更好方法是二进制向量。在您的情况下,除了 4 个连续值输入之外,您还有 8 个二进制输入神经元,其中只有一个被激活 (1),其他 7 个处于非活动状态。
你这样做的方式暗示了计算方法之间的人为关系,这几乎可以肯定是一个人工制品。例如,1 和 2 在数字上(从您的网络的角度来看!)比 1 和 8 更接近。但是方法 nr. 1 和 2 真的比方法 1 和 8 更相似或相关吗?
【解决方案2】:
由于您没有提供太多细节,我的回答不能很具体。
一般而言,当将标称值编码为数值时,神经网络的性能往往会更差,因为转换会对变量施加(可能)错误的排序。混合具有非常不同级别的输入也往往会恶化性能。
但是,鉴于此处提供的信息很少,无法判断这是否是网络性能“不如您所愿”的原因。也可能是您没有足够的训练数据,或者您的训练数据包含大量噪音。也许您需要预先缩放您的数据,也许您的网络代码中存在错误,也许您为您的学习算法选择了不合适的常量值......
神经网络未按预期执行的原因多种多样(其中有不合理的高期望值)。如果没有更多信息,就无法知道您的问题是什么。
【解决方案3】:
将类别映射到数值在统计中并不是一个好的做法。尤其是在神经网络的情况下。请记住,神经网络倾向于将相似的输入映射到相似的输出。如果您将类别 A 映射到 1 并将类别 B 映射到 2(都作为输入),NN 将尝试为这两个类别输出相似的值,即使它们彼此无关。
首选稀疏表示。如果您有 4 个类别,请像这样映射它们:
A -> 0001
B -> 0010
等
看看“主题:类别应该如何编码?”在这个链接中:
ftp://ftp.sas.com/pub/neural/FAQ2.html#A_cat
【解决方案4】:
前面的答案是正确的 - 不要将标称值映射到任意数字值。但是,如果属性具有序数性质(例如“低”、“中”、“高”),您可以通过升序数值替换标称值。请注意,这可能不是最佳解决方案 - 因为无法保证例如,根据数据的性质,“High”=3。相反,请按照建议使用 one-hot bit 编码。
原因是神经网络与回归非常相似,因为多个数值通过某种聚合函数 - 但这种情况会发生多次。每个输入也乘以一个权重。
因此,当您输入一个数值时,它会经过一系列数学运算来调整其在网络中的权重。因此,如果您将数值用于非标称数据 - 映射到更接近数值的标称值在最好的情况下将被视为相同,在最坏的情况下 - 它可能会损害您的模型。