一种时代的热编码

数据挖掘 神经网络 数据清理 正常化 编码 毫升
2022-03-15 12:20:33

我的任务是使用 MLP 预测一个人还能活多少年。我想讨论一个特定的特征:当前年龄。

从统计学上讲,这是一个条件概率。示例:0 岁时,我预计能活到 70 岁(还剩 70 岁)。然而,当我 70 岁时,我预计能活到 83 岁(还剩 13 年)。

在我的数据集中,我有一个人死亡的真实年龄,并且它遵循一个分布。因此,我增加了我的数据,如果有人在 N 岁时去世,那么将有 N 个当前年龄(特征)的数据点从 0 -> N 和相应的剩余年数(目标)从 N -> 0。

通过这种增强,我希望通过数据模拟当前年龄与剩余年数的分布。我永远不会希望我的网络输出(在非规范化之后)如果当前年龄是 70 岁,那么这个人将剩下 50 年。

现在,MLP 的最佳实践表明 1-2 个隐藏层就足够了,隐藏层中的节点数量应该介于输入和输出层的数量之间。但是,如果我只是通过特征缩放来标准化年龄,我将有一个输入节点、一个隐藏节点和一个输出节点。这实际上还不够,我希望我需要很多隐藏节点。

如果我使用一种代表当前年龄从 0 到 100 的热编码。通过良好的实践,我将能够使用 50 个隐藏节点。如果我今天 70 岁,我可能永远不会激活那个告诉我我还能再活 50 年的节点。

那么我的问题是,我是否应该跳过一个热编码,而只是缩放年龄并使用例如 50 个隐藏节点?

从理论上讲,因为年龄是连续的,不像说“猫”和“机器人”那么明显也不离散,那么一键编码是不必要的,但是如果我选择一键编码有什么缺点吗?

3个回答

预测一个人还能活多少年的任务称为生存分析。生存分析是一种时间到事件分析。因此,生存分析需要一种特殊类型的损失函数。适当的损失函数可以避免当前年龄为 70 岁时还剩下 50 年的预测。常见的生存分析模型是Cox 回归模型,它可以适应神经网络。

如果使用生存分析,可以直接在单个输入节点中将当前年龄输入模型中。

one-hot 编码的缺点是它生成的矩阵非常稀疏神经网络讨厌稀疏数据:梯度下降优化器在连续变量上发挥最佳作用,而当可变性如此之小时,权重更新效果不佳。

永远不会推荐人工神经网络的单热编码。我只在绝对必要时使用它,并尽可能避免使用它。我作为数据科学家的个人经验告诉我,稀疏的数据矩阵通常会导致糟糕的结果。

但是,我认为您将需要一种称为生存分析的统计技术。它实际上有很多名称:生存回归、事件历史模型、持续时间模型等。这是生物统计学家几十年前发明的一种技术,旨在估计患者死亡的概率,考虑到经过多少时间和外部变量。后来它被应用到许多与医学无关的科学领域。它可以概括为一种旨在估计终止事件发生的可能性的技术。从数学上讲,它是在估计一个过程在时间上的“生存概率”。只需谷歌搜索即可找到大量信息。一个好的开始就在这里这里在这里关于这个主题的最好的书之一就是这本书(它是为社会科学家写的,但对任何人都非常有用。)

有人开发了神经生存模型,使用人工神经网络来估计过程的生存概率。但是我从来没有碰巧在实践中尝试过这些模型。你可以在这里这里阅读一些有趣的东西

这类模型(ANN 与否)将使您将年龄视为连续变量。

我们知道 MLP 可以在紧凑的支持上计算任何函数(达到任何精度)。我不是神经网络专家,但我的直觉告诉你,你可以尝试用一个隐藏层包含 100 个隐藏神经元的网络对其进行建模。然后只需将您提到的数据提供给它:对于每个年龄a给它提供训练数据{(0,a), (1,a1), , (a,0)}. 我不确定在这种情况下合并结果是否会有所帮助。首先采用已知分布(例如高斯分布)(当然预期寿命不是),从中生成一些训练数据,看看您是否可以近似它,这可能会有所帮助。