为KERAS LSTM准备时间序列数据 - 损失极高的网络火车



我正在遇到准备数据以在Keras的LSTM层中使用的问题。数据是一个1,600,000项时间序列CSV,由日期和三个功能组成:

Date F1 F2 F3 2016-03-01 .252 .316 .690 2016-03-02 .276 .305 .691 2016-03-03 .284 .278 .687 ... 我的目标是预测F1 Prediction_period 时间段的价值。了解KERAS的LSTM层以格式(示例,时间段,尺寸)采用导入数据,我编写了以下功能,以将数据转换为以这种格式的3D Numpy阵列(以2016-03-03为例):

[[[[[284,.278,.687],[.276,.305,.691],[.252,.316,.690]],...其他样品...P>

此功能通过堆叠数据的副本来创建数组,每个副本都会返回一步。回顾是堆栈中的"图层"数量,而Trainpercent是火车/测试拆分:

def loaddata(path):
    df = pd.read_csv(path)
    df.drop(['Date'], axis=1, inplace=True)
    df['label'] = df.F1.shift(periods=-prediction_period)
    df.dropna(inplace=True)
    df_train, df_test = df.iloc[:int(trainpercent * len(df))], df.iloc[int(trainpercent * len(df)):]
    train_X, train_Y = df_train.drop('label', axis=1).copy(), df_train[['label']].copy()
    test_X, test_Y = df_test.drop('label', axis=1).copy(), df_test[['label']].copy()
    train_X, train_Y, test_X, test_Y = train_X.as_matrix(), train_Y.as_matrix(), test_X.as_matrix(), test_Y.as_matrix()
    train_X, train_Y, test_X, test_Y = train_X.astype('float32'), train_Y.astype('float32'), test_X.astype('float32'), test_Y.astype('float32')
    train_X, test_X = stackit(train_X), stackit(test_X)
    train_X, test_X = train_X[:, lookback:, :], test_X[:, lookback:, :]
    train_Y, test_Y = train_Y[lookback:, :], test_Y[lookback:, :]
    train_X = np.reshape(train_X, (train_X.shape[1], train_X.shape[0], train_X.shape[2]))
    test_X = np.reshape(test_X, (test_X.shape[1], test_X.shape[0], test_X.shape[2]))
    train_Y, test_Y = np.reshape(train_Y, (train_Y.shape[0])),  np.reshape(test_Y, (test_Y.shape[0]))
    return train_X, train_Y, test_X, test_Y
def stackit(thearray):
    thelist = []
    for i in range(lookback):
        thelist.append(np.roll(thearray, shift=i, axis=0))
    thelist = tuple(thelist)
    thestack = np.stack(thelist)
    return thestack

当网络接受数据并进行训练时,损失值异常高,考虑到数据具有确定的周期性趋势,这非常令人惊讶。为了尝试隔离问题,我用sin波数据集替换了我的数据集和网络结构,并从此示例中结构结构:http://www.jakob-aungiers.com/articles/a/lstm-neural-network-for-series-prediction。

即使使用SIN波数据集,示例函数产生的损失仍然高于数量级。我使用一个列的顺序数据集对函数进行了逐步处理,并将预期值与实际值进行了比较。我没有发现任何错误。

我是否为KERAS的LSTM层错误地构建了输入数据?如果是这样,做这件事的正确方法是什么?如果没有,您期望会导致这些症状(即使有40个以上的时代)或其他方式引起这些症状(即使随着40个以上的损失也不会减少)。

事先感谢您提供的任何建议!

这是您可以做一些改进预测的事情:

  1. 首先确保输入数据是集中的,即应用一些标准化或归一化。您可以使用来自Sklearn库或实施的Minmaxscaler或StandardardScaler根据您的数据进行一些自定义缩放。

  2. 确保您的网络(LSTM/gru/rnn)足够大,可以捕获数据中的复杂性。

  3. 使用keras中的张板回调来监视您的体重矩阵和损失功能。

  4. 使用自适应优化器而不是设置自定义学习参数。也许是'adam'或" adagrad"。

使用这些至少可以确保您的网络正在培训。随着时间的流逝,您应该看到损失的逐渐减少。解决此问题后,您可以自由尝试最初的超参数并实施不同的正则化技术

祝你好运!

a"高损失"是非常主观的事情。我们无法在不看到您的模型的情况下进行评估。

它可能来自多种原因:

  • 训练损失可能受正规化技术的影响。例如,L2正则化的全部要点是在损失中添加模型的权重。
  • 损失由目标函数定义,因此取决于您使用的目标。
  • 您使用该目标函数的Optmizer可能无法适应。一些优化器不会加剧损失的融合。
  • 您的时间意甲可能无法预测(但这显然不是您的情况)。
  • 您的模型可能不足以实现您要完成的任务。
  • 您的培训数据未正确准备(但是您已经调查了)

您看到有很多可能性。高损失本身并不意味着任何事情。您可能会有很小的损失,并且只需 1000,而您的损失将是很高的事件,即使解决了问题

最新更新