• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

MinMaxScaler scaler.inverse_transform不能反归一化正确的数据

武飞扬头像
321yu
帮助1

起因

参考代码[时间序列预测]基于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
系列文章
更多 icon
同类精品
更多 icon
继续加载