LTSM模型预测数据如何归一化?(知乎回答)
小白想问一个问题困扰很久的问题。我已经训练好了一个LTSM网络模型,训练的数据都是经过归一化,但是我用新的数据进行预测的时候,预测数据也要归一化吗?如果我用于预测的新数据恰好就是一个数值,归一化后就是1,那是不是直接预测成最大值了?
其实这个不仅仅是针对LSTM模型,而是针对机器学习中的任何模型。通常,为了使得训练出来的模型具有更强的泛化能力以及加快模型的训练速度,我们需要对数据集进行划分。一般来说都将数据集划分成训练集与测试集两个部分,训练集用来训练模型测试集用来测试模型。但是,由于各类原因我们在训练模型时需要对数据进行归一化或者其他的特征缩放,那么此时应该怎么做呢?一个大的原则就是利用训练时归一化训练集得到的参数来归一化未来新的数据,包括测试集,并且必须是这样。 下面以min-max归一化进行举例说明:
1 数据生成
生成数据集,并以7-3的比例划分数据集:
x = np.random.randint(0, 100, 20).reshape(10, 2)
x_train, x_test = x[:7], x[-3:]
#结果
# x x_train x_test
[[75 27] [[75 27] [[34 75]
[ 6 2] [ 6 2] [74 0]
[ 3 67] [ 3 67] [76 13]]
[76 48] [76 48]
[22 49] [22 49]
[52 5] [52 5]
[13 89] [13 89]]
[34 75]
[74 0]
[76 13]]
2 训练集归一化
以训练集为标准进行归一化,同时以归一化得到的参数对测试集进行归一化。
def feature_scalling(X):
mmin = X.min()
mmax = X.max()
return (X - mmin) / (mmax - mmin), mmin, mmax
x_train, mmin, mmax = feature_scalling(x_train)
print(mmin,mmax)
print(x_train)
#结果
2 89
[[0.83908046 0.28735632]
[0.04597701 0. ]
[0.01149425 0.74712644]
[0.85057471 0.52873563]
[0.22988506 0.54022989]
[0.57471264 0.03448276]
[0.12643678 1. ]]
由于采用的是min-max归一化,所以训练集中第一个样本被归一化的计算过程为:
3 测试集归一化
在对训练集进行归一化后,我们便得到了归一化中需要的参数最小值mmin,和最大值mmax。此后,只要是用训练集训练得到的模型对其他任何新数据进行预测时,做归一化用到的参数都必须是上述的mmin和mmax。尽管此时测试集中的最小值为0,但还是要以mmin为最小值进行归一化。
x_test = (x_test-mmin)/(mmax-mmin)
print(x_test)
#结果
[[ 0.36781609 0.83908046]
[ 0.82758621 -0.02298851]
[ 0.85057471 0.12643678]]
所以,测试集中样本被归一化的过程为:
4 新数据归一化
可能某一天突然要对一个新来的数据进行预测,那么也要对其用已有的归一化参数进行归一化:
此时,尽管新数据中的-5与98均分别小于训练集中的2与89,但是依旧要以训练集中的最大值最小值为准。
5 总结
总结就是,预测的时候千万不要拿新数据里面的最大值与最小值来对新数据进行归一化,而是应该取训练时数据里的最大值和最小值来对新数据来归一化。因此,在使用其他方式进行特征标准化时,训练集标准化后同样需要将对应的参数保存下来以便后续新数据的标准化。本次内容就到此结束,感谢阅读!
若有任何疑问,请发邮件至moon-hotel@hotmail.com并附上文章链接,青山不改,绿水长流,月来客栈见!