MinMaxScaler scaler.inverse_transform不能反归一化正确的数据
起因
参考代码[时间序列预测]基于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,没有用。
3.demo理解反归一化
sklearn MinMaxScaler对某一个特征反归一化
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfeceg
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01