起因
参考代码[时间序列预测]基于BP、RNN、LSTM、CNN-LSTM算法多特征(多影响因素)用电负荷预测[保姆级手把手教学]
他的源代码部分:
我的代码仿写部分:
# 将真实值标签进行反归一化操作
real = np.concatenate((test[16:, :-1], y_test), axis=1)#我猜这个-1只是为了让合并的列为5个,保持列维不变
print('contenate的归一化真实值real:\n',real)
print('======================================\n\n')
#3.反归一化
real = scaler.inverse_transform(real)#反归一化。反回来的最后一列就是不对???
real = real[:, -1]
print('反归一化第3列真实值real:\n',real)
real_1 = pd.DataFrame(real)
# real_1.to_csv('real-step11.27.csv')#真实标签值
# 将模型预测出的值进行反归一化操作
prediction = np.concatenate((test[16:, :-1], predicted), axis=1)#归一化后的值在列上的合并
# print('打印prediction:\n',prediction)
# print(prediction.shape)
prediction = scaler.inverse_transform(prediction)#反归一化
prediction = prediction[:,-1]
print('反归一化的第3列预测值:\n',prediction)
prediction_1 = pd.DataFrame(prediction)
# prediction_1.to_csv(('prediction-step11.27.csv'))#预测标签的值
对np.concatenate的理解
其中的np.concatenate就是拼接,按列拼接。
我拿个demo来解释一下:
import numpy as np
x=[[1,2,3],[2,3,4],[3,4,5]]
y=[['a'],['b'],['c']]
real = np.concatenate((x, y), axis=1)#拼接
print(real)
打印结果:
[['1' '2' '3' 'a']
['2' '3' '4' 'b']
['3' '4' '5' 'c']]
也就是从demo理解了我把y列加在了x上,并且是在最后列。
好,理解了这里,回到主题。先来看看我的 test[16:, :] 数据大概样子:
0,1,2,3,4#索引
37.9542,-123.8893,7.4,154.2,154
37.95203,-123.88796,7.7,152.7,154
37.94984,-123.88661,7.4,153.8,153
37.94767,-123.88525,7.4,152.1,155
37.94558,-123.88393,7.4,153.1,154
37.94342,-123.88258,7.5,154.6,156
37.94161,-123.88145,7,153.4,155
37.93982,-123.88034,7.1,151.9,154
37.93783,-123.87911,7.1,153.7,155
对应看这行代码:
prediction = np.concatenate((test[16:, :-1], predicted), axis=1)#归一化后的值在列上的合并
为啥写成test[16:, :-1],就去掉了最后一列特征,然后最后拼接上预测得到的predicted一列,才能反归一化?下面给出了相关解答。 就是保证我归一化时输入的5个特征列,那么我反归一化也要保证为5个特征列,这样代码不会报错。
相关解答:
1.2.
‘由于归一化是按列进行的,scaler会对每一列生成用于放缩的属性,所以在反归一化时,需要输入数据维度和原数据维度相同。’
关于MinMaxScaler的反归一化inverse_transform的理解
那么在维度问题上我们解决了前后一致,接着看下面:
prediction = scaler.inverse_transform(prediction)#反归一化
prediction = prediction[:,-1]
print('反归一化的第3列预测值:\n',prediction)
代码中看到inverse_transform反归一化刚才合并的prediction。prediction[:,-1],就是把合并后的最后列给到我要反归一化的列然后打印出来,发现并不是第3列(特征3)的相关的值,很大很离谱的值。
我找了很久问题,只是理解了归一化和返归一化的维度问题,却忽略了返回一化之前要把预测的归一化数据放回原来的位置。在这篇博文里我受到了启发【关于归一化与反归一化数据统一的问题】:训练集与测试集必须使用同一参数的归一化与反归一化,我圈出来的地方就是我理解到的:
再回归我的代码。就是说我不是拼接在最后,我是要用预测的值换掉原来输入的位置上的值,我拼接出来的其实是占据了第5个特征的位置,所以返回的值不对,正确的我要反归一化第3列的值,我就把预测的放回第3列。
更正后的代码:
# 将真实值标签进行反归一化操作
#1.查看test[16:,2]和y_test的shape
print(test[16:,2].shape,y_test.shape)#查看一下替换的维度。
#2.y_test改成和test[16:,2]一样的维度
y_test= np.reshape(y_test,(y_test.shape[0],))
print('更改维度后的y_test:\n',y_test)
#3.再把y_test替换test[16:,2]
test[16:,2]=y_test
real = test[16:,:]
print('归一化后的真实值real:\n',real)
print('======================================\n\n')
#3.反归一化
real = scaler.inverse_transform(real)#反归一化。反回来的最后一列就是不对
'由于归一化是按列进行的,scaler会对每一列生成用于放缩的属性,所以在反归一化时,需要输入数据维度和原数据维度相同。'
real = real[:,2]
print('反归一化后的真实值real:\n',real)
real_1 = pd.DataFrame(real)
real_1.to_csv('real11.29.csv')#真实标签值
# 将预测值标签进行反归一化操作,方便后续和真实值进行对比
#1.查看test[16:,2]和y_test的shape
print(test[16:,2].shape,predicted.shape)#查看一下替换的维度。
#2.y_test改成和test[16:,2]一样的维度
prediction = np.reshape(predicted,(predicted.shape[0],))
print('更改维度后的y_test:\n',prediction )
#3.再把y_test替换test[16:,2]
test[16:,2]=prediction
prediction= test[16:,:]
print('归一化后的预测值prediction:\n',prediction)
print('======================================\n\n')
#3.反归一化
prediction = scaler.inverse_transform(prediction)#反归一化
prediction = prediction[:,2]
print('反归一化后的预测值prediction:\n',prediction)
prediction_1 = pd.DataFrame(prediction)
prediction_1.to_csv('prediction11.29.csv')#真实标签值```
最后可视化一下:
预测评价指标:指标不高,但返回来的值是对的了。
R2:0.84535
MAE:0.17494
RMSE:0.22439
后续
这个问题真的困扰了几天,解决了。
1.环境
我的环境是python3.6+tensorflow2.4.0+keras2.4.3,另外一个python3.8+tensorflow2.4.0+keras2.4.3也能用。
2.无效尝试
1)[使用MinMaxScaler 中scaler.inverse_transform不能返回原来数据的原因](https://blog.csdn.net/llllwwsasa12345/article/details/123768063)
2)还有训练是.fit_transform,测试改为.transform,没有用。文章来源:https://www.toymoban.com/news/detail-421831.html
3.demo理解反归一化
sklearn MinMaxScaler对某一个特征反归一化文章来源地址https://www.toymoban.com/news/detail-421831.html
到了这里,关于MinMaxScaler 中scaler.inverse_transform不能反归一化正确的数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!