前面的例子作者将数据做了差分,然后又搞了个逆差分,作者说是让数据stationary,我觉得他根本没有说到本质,事实上这个问题相当于速度和加速度的关系,每个月相当于一个单位时间,那么每个月的销量就是这个月的销售速度,差分相当于前后两个月的速度变化,即加速度,那么这个差分就相当于在更深的一层的加速度上来研究问题,好处是它的变化大多数情况下没有原始数据那么剧烈,因为一段时间内大多数情况下不会频发的发生影响数据的事件,拿加速来说就是导致加速度变化的外力不会频繁的变化。这对应于数学上的求导,微分,偏微分什么的!那么问题来了,LSTM经过多次的递代能否发现隐藏的加速?如果不能,或是需要运算的次数非常庞大,那么就最好直接的告诉它本质在哪里,来减小运算开销。
关于缩放,我觉得这作者犯了一个错误
def scale(train, test):
# fit scaler
scaler = MinMaxScaler(feature_range=(-1, 1))
scaler = scaler.fit(train)
# transform train
train = train.reshape(train.shape[0], train.shape[1])
train_scaled = scaler.transform(train)
# transform test
test = test.reshape(test.shape[0], test.shape[1])
test_scaled = scaler.transform(test)
return scaler, train_scaled, test_scaled
scaler = scaler.fit(train)是确定train的最大,最小值,转换test的时候也用的这个最大,最小值,那就不能保证把test里的数据都转化为-1~1。
scaler, train_scaled, test_scaled = scale(train, test) print('scaler is :', '\n', scaler, '\n', 'train_scaled is :', '\n', train_scaled, '\n', 'test_scaled is :', '\n', test_scaled)
加入上面的打印代码输出结果如下:
MinMaxScaler(copy=True, feature_range=(-1, 1))
train_scaled is :
[[-0.15241435 -0.80037766]
[-0.80037766 0.04828702]
[ 0.04828702 -0.496628 ]
[-0.496628 0.17669274]
[ 0.17669274 -0.21607769]
[-0.21607769 0.1891017 ]
[ 0.1891017 -0.1917993 ]
[-0.1917993 -0.32344214]
[-0.32344214 -0.52953871]
[-0.52953871 1. ]
[ 1. -0.96493121]
[-0.96493121 -0.10709469]
[-0.10709469 -0.39411923]
[-0.39411923 0.17453466]
[ 0.17453466 0.18856218]
[ 0.18856218 -0.59428109]
[-0.59428109 0.3633666 ]
[ 0.3633666 -0.48152145]
[-0.48152145 0.26625303]
[ 0.26625303 -0.22632857]
[-0.22632857 0.55813326]
[ 0.55813326 -1. ]
[-1. 0.26733207]]
test_scaled is :
[[ 0.26733207 -0.16644187]
[-0.16644187 0.39088211]
[ 0.39088211 -0.82411654]
[-0.82411654 0.51335312]
[ 0.51335312 -0.35743189]
[-0.35743189 0.04235231]
[ 0.04235231 0.59266253]
[ 0.59266253 -1.05826814]
[-1.05826814 1.32802806]
[ 1.32802806 -1.26760183]
[-1.26760183 0.41947667]
[ 0.41947667 0.20151066]]
可以看到6个值超出了-1~1的范围,所以我一直吐槽这个作者有些地方叙述混乱,果然就在代码中出了问题。这个模型使用前23个数据(差分把第一个数据弄没了)训练得到的权重和偏置来预测后面12个数据,这种固定方法,必然是测试数据越靠后偏差越大。
吐槽归吐槽,人无完人,不管怎么说,我们确实找不到更详尽的例子了,下面开始Keras中LSTM多输入时序预测的学习