如何改进我的神经网络输出?
How do I improve my Neural Network output?
我有一个包含 150 行、45 个特征和 40 个输出的数据集。我可以很好地过度拟合数据,但我无法为我的交叉验证集获得可接受的结果。
有了 25 个隐藏层和相当多的迭代次数,我的训练集准确率达到了 ~94%;在我的脸上露出笑容。但是交叉验证结果竟然不到15%。
因此,为了减轻过度拟合,我开始使用正则化参数 (lambda) 以及隐藏层的数量。我能得到的最佳结果 (CV) 在训练集上为 24%,在 lambda=1、70 个隐藏层和 14000 次迭代的训练集上为 34%。增加迭代器的数量也会使情况变得更糟;我不明白为什么我不能通过增加 lambda 和 iter 来改善 CV 结果?
这是我尝试过的 lambda-hiddenLayer-iter 组合:
https://docs.google.com/spreadsheets/d/11ObRTg05lZENpjUj4Ei3CbHOh5mVzF7h9PKHq6Yn6T4/edit?usp=sharing
尝试更智能的 regulationParameter-hiddenLayer-iters 组合的任何建议方法?或者其他改进我的神经网络的方法?我使用来自 Andrew Ng 的 ML class 的 matlab 代码(使用反向传播算法。)
一些建议:
过度拟合主要发生在神经网络的结构对于手头的问题来说过于复杂时。如果神经网络的结构不太复杂,增加迭代次数应该不会降低预测的准确性
70个隐藏层已经很多了,你可以尝试大幅减少隐藏层的数量(到3-15)并增加迭代次数。从您的文件看来,与 70 个隐藏层相比,15 个隐藏层更好
在减少隐藏层数量的同时,您可以改变隐藏层中的神经元数量 (increase/decrease) 并检查结果如何变化
仅从具有 45 个特征的 150 个训练示例中学习任何东西是非常困难的(如果我没看错你的问题,40 个可能的输出 类)。如果你想学习一个合理的分类器,你需要更多带标签的训练示例——如果你有 40 个可能 类,可能需要数万或数十万个。即使对于二元分类或回归,您也可能需要数千个具有 45 个有意义特征的示例。
我同意洛根的观点。您在数据集中看到的内容非常有意义。如果你简单地训练一个具有 45 个特征的 NN 分类器用于 40 类,你将获得很高的准确性,因为你有比输出更多的特征-类。因此,该模型基本上可以 "assign" 每个特征到输出类之一,但生成的模型将高度过度拟合,并且可能无法代表您正在建模的任何内容。您明显较低的交叉验证结果似乎是正确的。
您应该重新考虑您的方法:为什么您有 40 类?也许您可以将您的问题改为回归问题而不是分类问题?还可以尝试研究其他一些算法,例如 Random Forrest。或者显着减少特征数量。
我有一个包含 150 行、45 个特征和 40 个输出的数据集。我可以很好地过度拟合数据,但我无法为我的交叉验证集获得可接受的结果。
有了 25 个隐藏层和相当多的迭代次数,我的训练集准确率达到了 ~94%;在我的脸上露出笑容。但是交叉验证结果竟然不到15%。
因此,为了减轻过度拟合,我开始使用正则化参数 (lambda) 以及隐藏层的数量。我能得到的最佳结果 (CV) 在训练集上为 24%,在 lambda=1、70 个隐藏层和 14000 次迭代的训练集上为 34%。增加迭代器的数量也会使情况变得更糟;我不明白为什么我不能通过增加 lambda 和 iter 来改善 CV 结果?
这是我尝试过的 lambda-hiddenLayer-iter 组合:
https://docs.google.com/spreadsheets/d/11ObRTg05lZENpjUj4Ei3CbHOh5mVzF7h9PKHq6Yn6T4/edit?usp=sharing
尝试更智能的 regulationParameter-hiddenLayer-iters 组合的任何建议方法?或者其他改进我的神经网络的方法?我使用来自 Andrew Ng 的 ML class 的 matlab 代码(使用反向传播算法。)
一些建议:
过度拟合主要发生在神经网络的结构对于手头的问题来说过于复杂时。如果神经网络的结构不太复杂,增加迭代次数应该不会降低预测的准确性
70个隐藏层已经很多了,你可以尝试大幅减少隐藏层的数量(到3-15)并增加迭代次数。从您的文件看来,与 70 个隐藏层相比,15 个隐藏层更好
在减少隐藏层数量的同时,您可以改变隐藏层中的神经元数量 (increase/decrease) 并检查结果如何变化
仅从具有 45 个特征的 150 个训练示例中学习任何东西是非常困难的(如果我没看错你的问题,40 个可能的输出 类)。如果你想学习一个合理的分类器,你需要更多带标签的训练示例——如果你有 40 个可能 类,可能需要数万或数十万个。即使对于二元分类或回归,您也可能需要数千个具有 45 个有意义特征的示例。
我同意洛根的观点。您在数据集中看到的内容非常有意义。如果你简单地训练一个具有 45 个特征的 NN 分类器用于 40 类,你将获得很高的准确性,因为你有比输出更多的特征-类。因此,该模型基本上可以 "assign" 每个特征到输出类之一,但生成的模型将高度过度拟合,并且可能无法代表您正在建模的任何内容。您明显较低的交叉验证结果似乎是正确的。
您应该重新考虑您的方法:为什么您有 40 类?也许您可以将您的问题改为回归问题而不是分类问题?还可以尝试研究其他一些算法,例如 Random Forrest。或者显着减少特征数量。