神经网络回归负面表现

数据挖掘 神经网络 回归 预测建模 毫升
2022-03-06 21:36:17

我对多层感知器回归器(神经网络)的性能有疑问,我不知道为什么。

任务:我正在尝试改进时间序列预测。我预测了过去 4 年的物理参数以及准真实值。我用我感兴趣的那一天的 -7 天到 +1 天的预测来训练 NN 作为特征,以便获得当天更好的预测。

问题:无论是训练数据还是测试数据,NN 的输出都比我感兴趣的那一天的特征差。在 RMSE 和 MAE 方面。我希望输出至少与我输入到 NN 的特征处于同一水平。

训练和测试数据的 RMSE 之间的比较,以及其中一个特征的比较

方法: Python 与 sklearn。我使用带有交叉验证的网格搜索来获得良好的超参数。我测试了不同的隐藏层配置、激活函数、学习率和正则化惩罚强度。我将数据分成 66% 用于训练,其余数据用于测试。

我非常感谢提示如何找出我的问题所在。

编辑: 我正在使用 sklearn.neural_network.MLPRegressor,它提供“identity”、“logistic”、“tanh”和“relu”作为激活函数,我已经在网格搜索中测试了所有这些函数。

我没有缩放特征矩阵,因为所有特征都与所需的输出在同一个单位中,范围从大约 -1 到 +1。

编辑2:

tuned_parameters = [{'hidden_layer_sizes': [int(2/3*number_features),
                                        (int(2/3*number_features), int(4/9*number_features)),
                                        (int(2/3*number_features), int(4/9*number_features), int(8/27*number_features))],
                 'alpha': 10.0 ** -np.arange(1, 4),
                 'activation': ["identity", "relu", "logistic", "tanh"],
                 'learning_rate': ['adaptive', "invscaling"],
                 'solver': ['lbfgs'],
                 'early_stopping': [True],
                 'max_iter': [600]}]
                 

regr = GridSearchCV(MLPRegressor(), tuned_parameters, n_jobs=3, verbose=2)
regr.fit(feature_training_matrix, combined_training_target_vector)

数据:我使用的预测数据具有以下结构:过去约 4 年的每一天,都有对未来 90 天的预测。我每天都有一个包含 -90d 到 +90d 数据的文本文件。我尝试训练 NN 来估计未来 10 天的更好预测。为此,我将当前预测日(当前使用的开始预测后 1-10 天)周围的 -7 到 +1 天作为特征。这意味着我感兴趣的那一天的预测被包含在一个特征中。

feature example: [0.16272058, 0.13296574, 0.14213905, 0.25064893, 0.23302285,
   0.21019931, 0.20733988, 0.1466959 , 0.17029025, 0.15876942]

corresponding target: 0.174652
1个回答

原始模型很可能已经做得很好 - 不可能改进它。例如,原始输入变量和目标之间的真实关系可能是线性的,因此神经网络不会添加任何内容。

作为测试,我会增加 hidden_​​layer_sizes 并设置 early_stopping=False 甚至只是进行网格搜索(没有 CV):RMSE 训练应该比 RMSE 特征更好。RMSE 测试很可能会更糟,但至少您将有证据表明没有其他意外情况(例如代码中的错误)。

使用基本模型的预测作为输入确实有意义。尤其是如果原始基础模型受到某种约束,并且您希望新模型的性能优于原始模型,因为在新模型中您没有该约束。例如,原始模型可能是线性的(ARIMA 或 ARIMAX),而您的模型是非线性的——神经网络。

即使输入和目标之间的真实关系是非线性的,你也没有太多的空间供神经网络使用(请记住,我们想要超越基础模型)。据我了解,您只有 ~ 4 * 365 个观察值。你可以很容易地用许多神经元进行过度训练,但只有少数神经元的训练可能会陷入局部最小值。