遇见问题
在用keras实现对某数据利用LSTM做时间序列回归的任务时,若loss出现以下情况:
注意其loss(此处用mean square error作为loss function)在很大的时候就收敛了,且预测值出现下面的情况:
问题解决——属性标准化attribute normalization或scaling
对输入数据进行特征标准化,即将输入数据的每个数据的均值变为0,方差变为1。可使用sklearn.preprocessing.scale(或直接减均值除标准差),设数据集样本数为n,每个样本维度(属性个数)为dim,train_x.shape=(n=10,dim=5),则代码如下:
from sklearn.preporcessing import scale
train_x = preprocessing.scale(train_x,axis=1)
print(train_x.mean(axis=1),len(train_x.mean(axis=1)))
print(train_x.var(axis=1),len(train_x.var(axis=1)))
输出为
[1.00981526e-16 3.12124716e-16 1.28521942e-16 -5.50808322e-17 -1.74422635e-16 4.23235827e-16 1.00981526e-16 3.12124716e-16 1.28521942e-16 -5.50808322e-17] 10 //都为非常接近0的值
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] 10 //即输出长度与数据长度相等
若train_x.shape为(dim,n)则上面代码中axis=0。其它设置不变,在进行运算可以得到loss以及预测值情况:
可以看到loss在更低处收敛且预测效果不再为常数。
这一部分的参考:
[1]https://github.com/keras-team/keras/issues/1727
[2]https://www.cnblogs.com/chaosimple/p/4153167.html
简单说说原理
目前本人有下面两种理解:
一、与输入数据的属性之间的数量级有关。scale可以将量级差过于大的伸缩到合适的分布,使得模型在训练时权重更加容易和稳定地学习。设一数据样本x=[attribute1,attribute2]=[[0.1,300],[0.2,200],[0.3,100]],当计算最简单的线性回归时,以x0=[0.1,300]为例: