神经网络-如何避免过拟合(Encog3 c#)
本文关键字:Encog3 拟合 何避免 神经网络 | 更新日期: 2023-09-27 17:54:49
我是神经网络的新手,我正在使用Encog3。我已经创建了前馈神经网络,可以训练和测试。问题是我不确定如何防止过拟合。我知道我必须将数据分成训练集、测试集和评估集,但我不确定何时何地使用评估集。目前,我将所有数据分成训练集和测试集(50%,50%),一部分训练网络,另一部分测试。准确率为85%。我尝试过CrossValidationKFold,但在这种情况下,准确率只有12%,我不明白为什么。
我的问题是,我如何使用评估集来避免过拟合?我对评估集感到困惑,任何帮助都将不胜感激。
通常的做法是分割60x20x20 %(另一种常见用法是80x10x10)。60%用于培训。20%用于验证,另外20%用于验证前两个。为什么是三部分?因为它会让你更好地了解机器学习如何处理以前从未见过的数据。分析的另一部分可能包括代表性学习集。如果你的训练数据集的值在验证中没有任何表示,那么很可能你的机器学习就会出错。这和你的大脑工作方式是一样的。如果你学了一些规则,然后突然接到一些任务,这些任务实际上是你所知道的规则的例外,很可能你会给出错误的答案。如果你在学习上有问题,你可以做以下事情:增加数据集,增加输入数量(通过对输入进行一些非线性转换)。也许你还需要应用一些异常检测算法。您还可以考虑应用一些不同的规范化技术。
作为一个简短的题外话,您一直将数据称为"评估"集。当它以这种方式使用时,一般的术语是"验证"集,这可能会让你在谷歌上搜索它时更成功。
你现在的设置有点像鸡生蛋还是蛋生鸡的问题。基本上,验证集的唯一目的是防止过拟合——不使用验证集将(出于所有意图和目的)导致过拟合。相比之下,测试集在防止过拟合方面没有任何作用,它只是最后观察是否可能发生过拟合的另一种方式。
也许把它从任何数学或代码(我假设你以前见过)中拿走会更容易,并将其想象为模型不断问自己的问题。在每个训练时期,模型都拼命地试图减少其对训练集的残差,并且,由于高度非线性,在结构化问题中,如果允许它继续运行,它很有可能将该误差减少到几乎为零。但这不是你想要的。您正在寻找一个模型,它是所有三个数据集的良好近似值。因此,我们让它在每个epoch执行以下操作:
"我的新动作是否减少了训练集上的错误?"如果是:"太棒了,我会继续朝这个方向努力。"
"我的新动作是否减少了验证集的错误?"如果是:"太棒了,我会继续朝这个方向努力。"
最后,你会看到:
"我的新动作是否减少了训练集上的错误?"是的:"太棒了,我会继续朝这个方向努力。"
"我的新动作是否减少了验证集的错误?"不,它增加了:"也许我走得太远了。"
如果验证误差继续上升,那么你已经确定了一个点,在这个点上你的模型正在从一个好的近似值转移到对训练集的过拟合。是时候停下来了。然后,您希望将最终模型应用于测试数据,并查看该模型是否仍然是该数据的良好近似值。如果是,你就有了你的模型。
最后一句话,很高兴看到你正在做某种形式的交叉验证,因为我在过去看到过这种保护错过了很多次。