使用神经网络(MLP)进行估计

我刚开始接触神经网络,并且遇到了这个问题:

我有一个包含300行和33列的数据集。每行还有另外3列用于结果。

我尝试使用MLP来训练模型,以便在有新行时,它能估计这3列的结果。

我在训练过程中可以轻松地将误差降低到0.001,但当我使用交叉验证时,估计效果却非常差。

如果使用用于训练的相同输入,它可以正确估计,但如果使用未用于训练的其他值,结果就会非常错误。

我使用了两个隐藏层,每层有20个神经元,所以我的架构是[33 20 20 3]。

对于激活函数,我使用了双极性S形函数。

你们有什么建议可以告诉我如何改进吗?


回答:

过拟合

正如评论中提到的,这完美地描述了过拟合。我强烈建议阅读维基百科上关于过拟合的文章,因为它很好地描述了原因,但在这里我将总结一些关键点。

模型复杂度

过拟合通常发生在你的模型对于问题来说过于复杂时。我对你的数据集一无所知,但我猜测[33 20 20 3]的参数可能比预测所需的更多。

尝试再次运行你的交叉验证方法,这次使用更少的层,或每层更少的节点。现在你使用33*20 + 20*20 + 20*3 = 1120个参数(权重)来进行预测,这是否必要?

正则化

解决过拟合的一个常见方法是正则化。其指导原则是KISS(保持简单,笨蛋)。

通过对你的权重应用L1正则化,你倾向于使用最少的权重来解决问题。网络会将许多不需要的权重拉到0。

通过对你的权重应用L2正则化,你倾向于使用较低秩的解决方案来解决问题。这意味着你的网络会更喜欢跨度较低维度的权重矩阵。实际上,这意味着你的权重将是较小的数字,并且不太可能“记住”数据。

L1和L2是什么?它们是向量范数的类型。L1是你的权重的绝对值之和。L2是你的权重的平方和的平方根。(L3是权重的立方和的立方根,L4…)。

变形

另一种常用的技术是用你训练样本的变形版本来增强你的训练数据。这只适用于某些类型的数据。例如,图像可以旋转、缩放、移动、添加高斯噪声等,而不会显著改变图像的内容。

通过添加变形,你的网络将不再只是记住你的数据,而是也会学习当事物看起来与你的数据相似时的表现。旋转2度的数字1仍然看起来像1,所以网络应该能够从这两个方面学习。

只有你了解你的数据。如果这是可以对你的数据进行的操作(即使只是对每个特征添加一点高斯噪声),那么也许值得研究。但不要盲目使用这种方法,而不考虑它可能对你的数据集产生的影响。

仔细分析数据

我把这点放在最后,因为这是对过拟合问题的一种间接回应。在将数据输入到黑盒算法(如神经网络)之前,先检查你的数据。如果你的网络不起作用,以下是一些值得回答的问题:

  1. 我的特征中有没有彼此强相关的?
  2. 基线算法的表现如何?(线性回归、逻辑回归等)
  3. 我的训练样本在各类别中的分布如何?我是否有298个样本属于一个类别,而另外两个类别各只有1个样本?
  4. 类别内的样本有多相似?也许我有100个样本属于这个类别,但它们都是相同的(或几乎相同)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注