我最近开始尝试将遗传编程作为优化工具。对于如何减少此框架中的过度拟合,我仍然有些困惑。
我读过的一些技术
- 限制代数
- 限制树(基因组)大小
- 为适应度函数添加复杂度惩罚
- 将交叉验证纳入适应度函数
在上述方法中,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 倾向于过度拟合。