如何避免过度拟合(Encog3 C#)?

时间:2015-06-09 17:57:58

标签: c# neural-network encog

我是神经网络的新手,我正在使用Encog3。我已经创建了可以进行训练和测试的前馈神经网络。 问题是我不确定如何防止过度拟合。我知道我必须将数据分成训练,测试和评估集,但我不确定何时何地使用评估集。 目前,我将所有数据分成训练和测试集(50%,50%),一部分训练网络,另一部分测试。准确率为85%。 我尝试使用CrossValidationKFold,但在这种情况下,准确率只有12%,我不明白为什么。

我的问题是,如何使用评估集来避免过度拟合? 我对评估集很困惑,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

通常的做法是拆分60x20x20(另一种常见用法是80x10x10)%。 60%用于培训。 20%用于验证,另外20%用于验证前两个。为什么三个部分?因为它可以让你更好地了解ML如何处理以前从未见过的数据。分析的另一部分可包括代表性学习集。如果您的训练数据集中的值没有任何验证表示,则很可能您的ML中会出现错误。这与大脑的运作方式相同。如果你学习了一些规则,然后突然得到一些任务,这实际上是你所知道的规则的例外,很可能你会给出错误的答案。如果您在学习方面遇到问题,可以执行以下操作:增加数据集,增加输入数量(通过输入进行一些非线性变换)。也许你还需要应用一些异常检测算法。您也可以考虑应用一些不同的规范化技术。

答案 1 :(得分:0)

快速地,您将数据称为“评估”集。虽然它正在以这种身份使用,但通用术语是“验证”设置,这可能会让你在谷歌搜索时获得更好的成功。

你现在的设置处于鸡与蛋的状态。基本上,验证集的唯一目的是防止过度拟合 - 不使用验证集(对于所有意图和目的)将导致过度拟合。相比之下,测试装置在防止过度装配方面没有任何作用,它只是另一种方式,最终看到是否可能发生过度装配。

也许从任何数学或代码(我假设你以前见过)中取出它会更容易,并将其想象为模型不断询问的问题。在每个训练时代,模型都拼命地试图减少其对训练集的残余误差,并且非常非线性,结构性问题很有可能将这个误差减少到几乎虚伪,如果你允许它继续运行。但那是而不是你所追求的。您正在使用的模型是所有三个数据集的良好近似值。因此,我们在每个时代都做到以下几点:

“我的新动作是否减少了训练设置的错误?”如果是:“太棒了,我会继续朝这个方向前进。”
 “我的新动作是否减少了验证设置的错误?”如果是的话:“太棒了,我会继续朝那个方向前进。”

最终,你会来:
“我的新动作是否减少了训练设置的错误?”是的:“太棒了,我会继续朝那个方向前进。”
“我的新动作是否减少了验证设置的错误?”不,它增加了:“也许我走得太远了。”

如果验证错误继续上升,那么您已经确定了模型远离成为一个好的近似值并转向过度适应训练集的点。是时候停下来了。然后,您希望将最终模型应用于测试数据,并查看模型是否仍然是该数据的良好近似值。如果是的话,你有你的模型。

最后一句话,很高兴看到你正在进行某种形式的交叉验证,因为我已经看到过去曾多次错过这种安全措施。

相关问题