神经网络仅适用于小型数据集

数据挖掘 机器学习 神经网络 深度学习 损失函数
2022-02-14 20:21:37

我有一个试图解决一些回归问题的神经网络。

当数据集有少量训练样本时,网络工作正常,比如 20 个。它当然过拟合,但训练损失减少到 0,这正是我现在想要的。

在此处输入图像描述

但是,当我获取包含 5000 个训练示例的整个数据集时,损失稳定在 375 左右。无论我添加多少隐藏层、神经元和激活,它都不会减少到零。我什么都试过了。

在此处输入图像描述

这是什么意思?为什么会发生这种情况,我该如何解决?训练一个适合训练数据的模型是不可能的吗?

4个回答

这可能意味着,您的数据太复杂,模型无法使用一定数量的观察来学习(您有多少特征?)。对于小数据集,图上的训练损失几乎为零,但您应该依赖验证损失,而不是训练损失。样本数量越多,验证损失越低,学习过程执行可预测的正常

检查绘图后的重要编辑

你的图没有显示同样的东西......第一个显示了 1000 个时期的 MAE,第二个显示了 100 个......看着它们,在第一个中,MAE 对于 100 个时期来说也很大。

一个公平的比较是显示 1000 个 epoch 的整个训练集的图

第一个答案

想象一下,您想要拟合以下函数,sin(x),以olny为红框内的训练数据点。使用线性模型f(x)=Wx+b您将在训练集上表现良好,而在验证集上表现不佳(如果它包含不仅属于红框的点)。

正如 Lana 所建议的,您可能正在经历类似的事情。您的 MLP 模型可以很好地拟合一小部分训练样本,但您无法为整个数据集找到合适的模型

罪(x)

无论我添加多少隐藏层、神经元和激活,它都不会减少到零。我什么都试过了。

关于深度学习,你几乎不可能尝试过所有事情……。您是否调整了学习率、优化器、使用的正则化、丢弃等等……?

这是什么意思?为什么会发生这种情况,我该如何解决?训练一个适合训练数据的模型是不可能的吗?

真的很难说,而且考虑到你的数据的高维性,你能告诉我们其他的吗?

正如 Lana 之前所说,网络可能会记住小的训练数据,而完整的数据集要么真的没有任何进一步的模式要学习,要么一旦达到高原,它们就太复杂而无法改进。

如果您不使用任何正则化(尝试 dropout?),您仍然可以通过使用某种正则化来改进您在验证集上的结果。

如果你只是想提高训练集的结果,你可能想降低高原的学习率。如果您使用 TensorFlow,请查看以下链接以了解如何操作。它可能会改善您的结果,但我认为损失不会为零。

https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ReduceLROnPlateau

我想您需要更多地进行数据预处理。您需要探索您的数据:

  • 检查每列中的异常值,您可以使用 z-score。
  • 如果您有缺失数据,那么您需要查看如何估算缺失值。
  • 如果您有一些分类变量,则需要查看如何对它们进行编码,例如使用 one-hot 编码或标签编码或二进制编码、目标均值编码等。

尝试进行特征选择和排名,并使用热图或皮尔逊系数研究它们之间的相关性,或者如果您有可能在其中具有某种序数排名的分类变量,您可以使用斯皮尔曼系数。

因为有一点很清楚,您的数据集对于神经网络来说太复杂了,无法识别任何模式或在您在某个高维平面中创建的数据流形中的特征之间建立任何类型的线性或非线性关系。因此,您需要以某种方式相互关联的特征,并尝试减少冗余特征的数量。

您可以做的一件事是将 RFECV 与任何梯度提升树算法一起使用,并获得您实际需要多少特征的基线,然后尝试缩放您的数据。如果不是正态分布,请尝试归一化,否则您可以使用 Min max scaler 或 standard scaler 并查看最适合您的方法。在使用神经网络时,正确地缩放数据非常重要,因为如果做得不好,神经网络往往会变得有偏见并且会出错。

您还应该尝试更好的重采样策略或增加 k-folds 可能会有所帮助。

如果您可以对您的数据集进行一些解释,这可能有助于其他人以更好的方式回答您的查询。像:

  • 你在做什么?
  • 你在预测什么?
  • 你的问题陈述是什么?