填充缺失值并标准化

数据挖掘 喀拉斯 熊猫 正常化 缺失数据 麻木的
2021-10-08 14:55:39

我有两列缺失值的神经网络训练数据。(还有许多其他列没有缺失值。)

例如

Height  | Weight
180     | 70
175     | N/A
N/A     | N/A

我想填充缺失值并规范化列。

数据是高度和重量,所以我认为一个好的填充值是 0 或 -1。这是基于Python 中的深度学习一书:

通常,对于神经网络,将缺失值输入为 0 是安全的,条件是 0 还不是有意义的值。

编辑我假设 0 在值为 150-200 的数据集中没有意义

还建议我通过减去平均值并除以每列的 std 来标准化数据。

这两个本身都很好 - 我理解如何以及为什么要这样做。我不明白如何将它们结合起来。我也可以...

  • 填充缺失值然后归一化,但是a)我的零将不再是零(我的网络仍然会知道它们是一个特殊值吗?),并且b)零会在一定程度上影响平均值/标准差,由多少值决定缺失。我想我担心这会产生奇怪的分布
  • 规范化然后填充缺失值。但是在我标准化我的数据之后,0 现在是我的列的平均值,因此不是同类填充值。我宁愿让网络知道这些值是未填充的,也不愿假设它们都取平均值

我正在使用带有Dense层的 Keras、Numpy 和 Pandas 来解决多类分类问题。

2个回答

我不明白你为什么要用零填充值!这基本上意味着,“这个人,身高 170 厘米,体重 0 公斤”并且会欺骗你的网络。在我看来,你有两个选择:

  • 丢弃缺失值(整行):你最终得到更少但更一致的训练数据
  • 如果你真的需要这些行,那么用一些启发式方法填充缺失值:例如,给它们列的平均值,或者应用简单的线性回归。请注意,这会在学习过程中增加偏差,但绝对比给出随机值要好。

至少,如果你有很多缺失值,那么也许你应该考虑为部分训练数据选择一个专门的模型。您实际上并没有告诉我们您使用的是什么网络,但您可以修改它以比填充缺失值更智能地处理缺失值。

最后,再次标准化的需要取决于您的模型(您没有描述)。但这肯定会在处理部分之后。

反复试验是深度学习的重要组成部分。在某些情况下,丢失的数据有意义,而在某些情况下,丢失的数据只是噪音。例如,在跟踪眼睛、鼻子或耳朵等面部特征时,丢失的数据会通知神经网络该特征不在视野范围内。其他时候,这是来自不良数据收集的噪音。

我建议使用以下数据拟合您的深度学习模型:

  1. 使用 0 表示缺失数据。
  2. 删除缺少数据的行。
  3. 使用缺失数据的平均值。
  4. 单变量特征插补或多元插值。
  5. 使用多元特征插补