【问题标题】:Genetic algorithm for classification用于分类的遗传算法
【发布时间】:2023-03-04 12:23:01
【问题描述】:

我正在尝试使用 Matlab GPTIPS 框架解决分类问题。 到目前为止,我设法构建了合理的数据表示和适应度函数,每类的平均准确率接近 65%。

我现在需要的是一些帮助解决两个困难:

  1. 我的数据有偏差。基本上我在解决二进制分类问题,只有 20% 的数据属于 1 类,而其他 80% 属于 0 类。我最初使用预测的准确性作为我的适应度函数,但它真的很糟糕。我现在最好的是

    适应度 = 0.5*(PositivePredictiveValue + NegativePredictiveValue) - const*ComplexityOfSolution

请告知,我该如何改进我的功能以纠正数据偏差。

  1. 第二个问题是过拟合。我将我的数据分为三部分:训练(70%)、测试(20%)、验证(10%)。我在训练集上训练每个染色体,然后在测试集上评估它的适应度函数。这个例程让我在测试数据上达到 0.82 的适合度,以获得人群中最好的个体。但同一个人在验证数据上的结果只有 60%。 每次在生成新种群之前,我都会添加对最佳个体的验证检查。然后我将验证集的适应度与测试集的适应度进行比较。如果差异大于 5%,那么我会增加适应度函数中解决方案复杂性的惩罚。但这没有帮助。 我还可以尝试在每一代使用验证集评估所有个体,并简单地删除过度拟合的个体。但是我看不出我的测试和验证数据之间有任何区别。在这里还能做什么?

更新:

对于我的第二个问题,我发现了很棒的文章 "Experiments on Controlling Overtting in Genetic Programming" 以及一些文章作者关于在 GP 中处理过度拟合的想法,它具有令人印象深刻的评论,其中引用了许多解决该问题的不同方法。现在我有很多新想法可以尝试解决我的问题。 不幸的是,仍然找不到任何关于选择合适的适应度函数的方法,该函数将考虑到我的数据中不平衡的类比例。

【问题讨论】:

    标签: classification genetic-algorithm genetic-programming


    【解决方案1】:

    当基线(将所有内容分类为具有最多样本的类)为 80% 时,65% 的准确度非常糟糕。您至少需要实现基线分类才能拥有比幼稚模型更好的模型。

    我不会惩罚复杂性。而是限制树的大小(如果可能)。您可以在运行期间识别更简单的模型,例如存储具有质量和复杂性的模型的帕累托前沿作为其两个适应度值。

    HeuristicLab 中,我们集成了基于 GP 的分类,可以做这些事情。有几个选项:您可以选择使用 MSE 进行分类或 R2。在最新的主干构建中,还有一个直接优化准确性的评估器(确切地说,它优化了分类惩罚)。优化 MSE 意味着它为每个类分配一个值 (1, 2, 3,...) 并尝试最小化该值的均方误差。起初这似乎不是最佳选择,但有效。直接优化精度可能会导致更快的过拟合。还有一个公式简化器,可让您修剪和缩小公式(并查看其效果)。

    另外,它需要是全科医生吗?您是否也尝试过随机森林分类或支持向量机? RF 速度很快,而且通常工作得很好。

    【讨论】:

    • 感谢您的回答!是的,我尝试了几乎所有常见的算法(RF、CART、BayesNet、NN、kNN、SVM 等)。我无法让他们工作。我现在正在做的是构建一组 GP 树,其中每棵树的结果代表新功能。然后我在这个新的特征空间中应用简单的 kNN 分类。到目前为止,我的验证数据达到了 0.70。现在我正在使用 k-nn 原型数据集添加数据集缩减。希望它能加快整个 GP 搜索周期,并消除数据中的一些噪音。
    • 另外,对不起,我原来的帖子中的错误 65% 不是准确度,它的 (PPV+NPV)/2,实际上我将“0”分类为 85-90% 的准确度,将“1”分类为50-55%。我肯定会更多地研究复杂性惩罚。实际上,我必须在某些时候添加它以强制执行更简单的模型,但也许您更直接的方法会更好。现在最困扰我的是过度拟合,因为它过早地阻止了我不断进化的种群。是否可以删除过度拟合的个体,或者验证集直到最后都无法触及?
    • 我会接受这个答案,因为帕累托前面的建议。目前它允许我将我的健康从 0.65 提高到 0.75。来自不同文章的其他技术(我尝试了大约 5 种不同的方法来处理过度拟合)并没有带来如此显着的改进。
    • 我认为您的过度拟合问题一方面是由于您优化了预测值,另一方面是您使用了 kNN。我假设您必须为 kNN 使用非常大的 k。无论如何,我认为 GA 在使用 kNN 时很难找到分离。正如我所说,我们优化了 MSE,效果很好,尤其是在防止过度拟合方面。我还尝试优化准确性,我在训练中得到了更好的解决方案,但在测试中更糟糕 => 过拟合。正如我所建议的,您可以尝试使用 HeuristicLab。我们内置了一个 MSE 评估器。
    • 是的,没问题,我的意思是只使用 HL 来检查 MSE 是否有效,因为这比你自己先实现它要快。如果是这样,您总是可以用您喜欢的任何语言为自己实现。 K=1 非常危险,因为这是最具体的最近邻模型,您要求过拟合。在 HL 中,我实现了另一种称为 Neighborhood Components Analysis 的方法,它是一种高级 k-NN,但对许多数据进行优化需要很长时间(它优化了软 k-nn 模型的 LOO 交叉验证误差)。对不起,我不能帮助你更多。玩得开心!
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2016-02-02
    • 2012-03-16
    • 1970-01-01
    • 2019-12-09
    • 2016-08-23
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多