【关于归一化与反归一化数据统一的问题】:

2,242 阅读2分钟

问题描述:

    在使用tensorflow + LSTM 进行股票预测,通过股票历史数据中对最低价、最高价、开盘价、收盘价、交易额、跌涨幅等因素对下一日股票最高价进行预测时,由于输入特征为7个,通过模型输出特征则为一个,反归一化时报错,报错为数据格式不同,所以对归一化与反归一化进行了代码理解。

进行归一化:

我们这次以sklearn包的MinMaxScale()为例

归一化时需要注意对两个问题:

**1、**训练集与测试集使用的归一化参数必须统一

2、一定要注意****fit_transform() 和 transform()的区别

我们先来看归一化与反归一化的例子来进行理解:

# 归一化
sc = MinMaxScaler(feature_range=(0, 1))、
# 求训练集的最大值,最小值这些训练集固有的属性,并在训练集上归一化
training_set_scaled = sc.fit_transform(training_set)
test_set = sc.transform(test_set)  # 这里特别要注意到fit_transform和transform的区别
# 取到训练集中的数据进行模型训练
x_train = training_set_scaled[:, :7]
y_train = training_set_scaled[:, 7]
..........
.........
.....
.. 我们跳过模型训练这一步

# 测试集输入模型进行预测
predicted_stock_price = model.predict(x_test)# 得到预测结果为1维
# 将预测结果设定与前面归一化为同一纬度,再进行反归一化
test_set[:, 7] = predicted_stock_price
# 再取出反归一化的值。
# 这样我们就可以在模型预测出一维数组也可以进行反归一化了
predicted_price = real_stock_price[:, 7]

# 画图
plt.plot()

这里主要有两个重点:

1、fit_transform() 和 transform()的区别。两者都是归一化函数,但是fit_transform() 会储存归一化函数是的相关参数,因此对训练集使用fit_transform() ,储存了训练集归一化的相关参数,然后利用这些参数对测试集进行统一的归一化transform()【切记不能再使用fit_transform() ,第二次使用fit_transform() 会刷新sc里储存的参数!!】

2、反归一化时任然要使用归一化时储存的参数和格式。归一化时使用的是mm = MinMaxScaler(),因此后面仍然要使用mm进行反归一化;归一化时fit_transform(train_set.values) 中的train_set.values是n7维度(这里10个样本,即为107)的数组,因此反归一化时的数据也必须是7列,即pre*7(pre为测试出到数据)以上就是以sklearn.preprocessing.MinMaxScaler为例的归一化和反归一化方法。

其他matlab或其他库的归一化和反归一化方法原理大致相同,只要把握以上两点即可。训练集、测试集、归一化、反归一化 均要使用同一参数的归一化函数!!