遗传编程中的过拟合

机器算法验证 交叉验证 遗传算法
2022-04-04 18:43:03

我最近开始尝试将遗传编程作为优化工具。对于如何减少此框架中的过度拟合,我仍然有些困惑。

我读过的一些技术

  1. 限制代数
  2. 限制树(基因组)大小
  3. 为适应度函数添加复杂度惩罚
  4. 将交叉验证纳入适应度函数

在上述方法中,4 对我来说是最有趣/最令人困惑的。我已经阅读了这篇关于 SO How to avoid overfitting when using crossvalidation in Genetic Algorithms的文章,但它并没有让我对实际实现有太多了解。

假设我正在尝试在我的适应度函数中实现交叉验证。我可以在某个时间段(比如 2000-2010 年)“训练”我的 GP,并在另一个时间段(比如 2010-2014 年)评估它的适应性。但是,这不只是在 2010-2014 年期间引入过拟合吗?GP 只会倾向于在测试时间段内找到好的程序。

或者,您可以说您想要一个在 2000-2010(性能 P1)和 2010-2014(性能 P2)上表现良好的程序。假设您的适应度函数要求 GP 在这两个时间段内的表现必须很高且相似(即适应度 = (P1 + P2) * 1/(P1 + P2)),但与只是测试整个 2000-2014 年的健康状况?

我想我在问是否有可能在你的适应度函数中实现一种交叉验证形式。GP 不是像 kNN、SVM 或简单线性回归这样的参数化算法,所以我对交叉验证在此设置中如何工作感到困惑。我总是可以在测试数据上评估朴素 GP 的输出,但在我的实验中,我没有发现良好的性能,因为 GP 倾向于过度拟合。

1个回答

我可以在某个时间段(比如 2000-2010 年)“训练”我的 GP,并在另一个时间段(比如 2010-2014 年)评估它的适应性。但是,这不只是在 2010-2014 年期间引入过拟合吗?GP 只会倾向于在测试时间段内找到好的程序。

是的,这是一个基本问题,它是由进化(作为 GA 背后的启发式方法的基础)和 GA 用于这种优化的一个非常根本的差异触发的:在进化中,每一代都包含的未知测试用例。

专门针对迭代优化方案的建议:尽可能限制代数

导致@DikranMarsupial 得出结论认为优化是万恶之源的根本问题是,寻找最大性能的算法将“撇去”方差,即它们找到的解决方案是训练和测试集拆分以及模型超参数的幸运组合.

对于 GA,您将在精英中积累此类解决方案,因此您可能希望关闭精英或至少使用新的交叉验证拆分重新评估

对于有助于解决这些差异问题的任何类型的数据驱动优化的一般建议是: 使用适当的评分规则进行性能评估。正确的评分规则表现良好,因为它们对模型的连续变化做出持续反应,并且它们通常也表现出比二分法(错误计数)损失函数更小的方差。

我建议的另外两个基本警告步骤是检查

  • 某种“基线”模型的性能(例如,根据数据和应用领域的知识设置超参数的模型)与优化器的“良好”结果与统计测试(例如 McNemar 的)进行比较。
    您还可以事先检查是否您有一个现实的机会获得一个模型,您可以在其中实际证明性能的提高(例如,如果您的基线模型已经有 90% 正确,那么考虑到您所拥有的测试用例总数,您是否有机会证明即使观察 100 % 正确的测试用例实际上对应于更好的模型?

  • 由于 GA 执行数据驱动的优化,您无论如何都需要通过另一个验证(循环)来验证最终的超参数集。计算您在内部用于 GA 的相同性能度量,也用于外部验证:差异是过度拟合的指标。
    虽然这在过度拟合时无济于事,但您至少可以检测到存在问题。

如果你需要文学作品,请告诉我——在这种情况下:你读过德语吗(我在我的文凭论文中使用了 GA——这就是我发现所有这些问题的方式......)