Tensor Flow Js中多个时间序列预测的最佳方法

时间:2018-08-19 20:45:16

标签: javascript tensorflow neural-network lstm tensorflow.js

编辑: 这个答案很有帮助,但是,我真的很想要一些实际的张量流javascript代码来展示如何实现此功能。 How to train a RNN with LSTM cells for time series prediction

我发现的其他问题未涵盖归一化或我对未来超过1点的预测的特定目标,要牢记局部性,即如果在T + 1预测1,则T + 2更有可能是0。

数据样本总数(实际上有132个样本)

const Data = [
    [0,45,0,0],
    [1,40,0,0],
    [0,10,3,0],
    [0,0,0,0],
    [2,30,0,1], 
    [2,20,3,1]
 ];

数组表示形式[X1,X2,X3,Y]

*注意X2需要归一化---如果我们需要在单个网络中进行所有这些预测时将X2预测为未来值以便预测Y,则不确定如何处理

最终目标

使用这些数据(包含更多的样本),以最准确的方式预测接下来的5个Y值,同时权衡先前的模式,就像在时间序列预测中一样,过去的样本可能会从那时起成为25个重要样本。

当前进度

通过在25个[X1,X2,X3]数组上进行训练而向前预测了25个值,只是发现输入位置1([X1,X2,X3]数组1)会影响所有接下来的25个Y值,但会影响位置2( [X1,X2,X3]数组2)仅会影响集合的2-25,依此类推,以此类推---位置25仅会影响25个预测值的最后一个值---所以我可能没有就网络而言,甚至可以真正预测下25个。

当前方法

期望的预测将是(例如)训练后的下三个Y值

输入:

[
    [0,45,0],
    [1,40,0],
    [0,10,3]
]

输出

[
    [0],
    [1],
    [1]
]

到目前为止尝试过的模型

var model = tf.sequential();

model.add(tf.layers.batchNormalization({
    inputShape:[null,6],
    axis: 2,
    units:10,
    //returnSequences: true,
    //kernelInitializer: 'VarianceScaling'
}));

model.add(tf.layers.lstm({
    //inputShape:[null,7],
    units: 10,
    activation: 'relu',
    returnSequences: true,
    //kernelInitializer: 'VarianceScaling'
}));

model.add(tf.layers.lstm({
    //inputShape:[null,7],
    units: 6, 
    activation: 'relu',
    returnSequences: true,
    //kernelInitializer: 'VarianceScaling'
}));

//modelHelper(model);
const optimizer = tf.train.adam (.05);
//optimizer: 'sgd', loss: 'binaryCrossentropy', lr: 0.1
model.compile({
    loss:tf.losses.meanSquaredError,
    optimizer:optimizer
});

在每个时间位置(X1,X2,X3)使用多个值时,预测时间序列的下一个4或5或25个单个(Y)值而不是仅预测下一个值的最佳方法是什么?

*浏览5年后创建了一个帐户,因此失去了这个帐户。

1 个答案:

答案 0 :(得分:0)

这里有很多问题。

  

预测时间序列的下一个4、5或25个单一(Y)值而不是仅预测下一个值的最佳方法是什么

您只需要返回lstm的序列。如果要预测接下来的4个值,则最后一个lstm层的units应该为4,并将返回值returnSequences设置为true。

如果您要根据序列预测1或0,则可以对最后一层使用binaryCrossEntropy损失和softmax激活来计算概率。至于最有可能的情况,如果数据与您的观察结果非常一致,则网络会找出来,即如果在T中预测为1,那么在T + i处可能预测为0。

  

X2需要归一化---如果我们需要在一个网络中将所有X2预测为将来值以便预测Y以便预测Y,则不确定如何处理

这并非特定于您的用例,最佳做法是将所有数据保持在同一范围内。对于具有高方差的数据,往往会在很大程度上影响影响收敛的模型。您可以在输入模型之前标准化x2功能。这是一个将所有功能的数据标准化的功能

// standardize a tensor data by computing (data - mean(data) ) / std(data)

function standardize(data) {
  let means = []
  let variances = []
  for ( let axe = 0 ; axe < axes; axe++) {
    const {mean, variance} = tf.moments(data.gather([axe], 1), undefined, true )
    means.push(mean)
    variances.push(variances)
  }

  return data.sub(tf.concat(means).reshape([axes])).div(tf.concat(variances).reshape([axes]))
}