如何用遗传算法避免过拟合

How to avoid overfitting with genetic algorithm

我面临以下问题。 我有一个系统能够根据异常分数对某些操作进行排名。为了提高性能,我实现了一个遗传算法来执行特征选择,这样最异常的操作就会出现在第一个位置。我所做的不完全是特征选择,因为我没有使用二进制变量,而是 0-1 之间的浮点变量,其总和等于 1.

目前,我有 50 代的 200 人种群。我使用系统本身作为评估函数,我通过使用真阳性率来评估解决方案的质量,计算前 N 个位置出现多少异常操作(其中 N 是异常操作的数量)。然后作为操作员统一交叉,我更改个体细胞的值以进行突变。当然,每次我都会进行检查以修复个体,使得总和为 1。最后我使用精英主义来保存迄今为止最好的解决方案。

我观察到一个特征具有非常高的价值,这通常很重要,但并非总是如此,这会导致其他特征的价值非常低。我怀疑我的 GA 过度拟合。 你能帮我找到一个好的止损标准吗?

遗传算法和编程中的过度拟合是一个大问题,目前是包括我在内的 GP 社区研究的重点。大多数研究针对 classification/regression 模型的遗传编程和进化,但它也可能与您的问题有关。有一些论文可能会对您有所帮助(我也在研究这些论文):

  • 贡萨尔维斯、伊沃和萨拉席尔瓦。 "Experiments on controlling overfitting in genetic programming." 第 15 届葡萄牙人工智能会议论文集:人工智能进展,EPIA。卷。 84. 2011.
  • Langdon, W. B. "Minimising testing in genetic programming." RN 11.10 (2011): 1.
  • 贡萨尔维斯、伊沃等。 "Random sampling technique for overfitting control in genetic programming." 遗传编程。 Springer Berlin Heidelberg, 2012. 218-229.
  • 贡萨尔维斯、伊沃和萨拉席尔瓦。通过训练数据的交错采样来平衡遗传编程中的学习和过度拟合。斯普林格柏林海德堡,2013 年。

您可以通过在 scholar.google.com.

中搜索它们的标题来找到论文(前两篇直接在 pdf 中)

基本上,所有论文都使用的是仅使用训练数据的一个子集来指导进化并(随机)每一代更改该子集的想法(对一代中的所有个体使用相同的子集).有趣的是,实验表明这个子集越小,过拟合就越少,甚至达到只使用 single-element 个子集的极端情况。这些论文采用了这个想法,并通过一些调整对其进行了扩展(比如在完整数据集和子集之间切换)。但正如我一开始所说,所有这些都是针对符号回归(或多或少)而不是特征选择。

我个人曾经尝试过另一种方法(同样是通过遗传编程进行符号回归)——使用训练数据的子集(例如一半)来驱动进化(即适应度),但是 "best-so-far" 解决方案是使用剩余训练数据的结果确定的。过度拟合的重要性要小得多。