过拟合
正如 cmets 中提到的,这完美地描述了过度拟合。
我强烈建议阅读关于过度拟合的维基百科文章,因为它很好地描述了原因,但我将在这里总结一些关键点。
模型复杂度
当您对问题进行不必要的复杂建模时,通常会发生过度拟合。我对您的数据集一无所知,但我猜 [33 20 20 3] 的参数比预测所需的参数多。
尝试再次运行您的交叉验证方法,这一次使用更少的层,或者每层的节点更少。现在你正在使用 33*20 + 20*20 + 20*3 = 1120 个参数(权重)来进行预测,这有必要吗?
正则化
过拟合的一个常见解决方案是正则化。驱动原理是KISS(保持简单,愚蠢)。
通过将 L1 正则化器应用于您的权重,您可以优先使用最少数量的权重来解决您的问题。网络会将许多不需要的权重拉到 0。
通过将 L2 正则化器应用于您的权重,您可以优先选择较低等级的解决方案来解决您的问题。这意味着您的网络将更喜欢跨越较低维度的权重矩阵。实际上,这意味着您的权重将是较小的数字,并且不太可能“记住”数据。
什么是 L1 和 L2?这些是向量范数的类型。 L1 是权重绝对值的总和。 L2 是您的权重平方和的平方。 (L3 是权重的立方和的立方根,L4 ...)。
失真
另一种常用的技术是使用扭曲版本的训练样本来扩充训练数据。这仅对某些类型的数据有意义。例如,图像可以旋转、缩放、移动、添加高斯噪声等,而不会显着改变图像的内容。
通过添加失真,您的网络将不再记忆您的数据,但也会学习何时看起来与您的数据相似。旋转 2 度的数字 1 看起来仍然像 1,因此网络应该能够从这两者中学习。
只有您知道您的数据。如果这是可以用您的数据完成的事情(甚至只是为每个特征添加一点高斯噪声),那么也许这值得研究。但是不要盲目地使用它而不考虑它可能对您的数据集产生的影响。
仔细分析数据
我把它放在最后是因为它是对过度拟合问题的间接反应。在通过黑盒算法(如神经网络)抽取数据之前检查您的数据。如果您的网络无法正常工作,以下是一些值得回答的问题:
- 我的任何特征是否相互之间有很强的相关性?
- 基线算法如何执行? (线性回归、逻辑回归等)
- 我的训练样本是如何在班级之间分布的?我是否有一个类别的 298 个样本和其他两个类别的 1 个样本?
- 我的样本在一个类中的相似度如何?也许我有 100 个样本用于这个类,但它们都相同(或几乎相同)。