数据预处理_数据反归一化01

数据反归一化

  1. 在数据处理中经常用到归一化将数据缩放到一个较为合理的范围。
  2. 归一化的方法有很多地方有讲,本篇不做解释
情况1-只对特征进行归一化

将特征和标签,放在相同的数组里,只对特征进行归一化,训练后的模型预测的值,即为最终的值,不需要反归一化。

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import normalize
# 生成数据,100行4列,前三列为特征,最后一列为标签值
a = np.random.randint(1,10,size=(100,3))
b = a[:,0]*0.2+a[:,1]*0.33+a[:,2]*1.3+np.random.randint(1,5,100)
b = b.reshape(100,1)
x = range(100)
co = np.concatenate((a,b),axis=1)
co[:,0] = co[:,0]*93
# 进行归一化
sca = MinMaxScaler()
X = sca.fit_transform(co1[:,0:3])
# 进行模型训练和预测,由于预测值未进行归一化,
model = LinearRegression()
mo =model.fit(X,co1[:,3])
p = mo.score(X, co1[:,3])
pred = mo.predict(X)
plt.figure(figsize=(13,2))
plt.plot(x, co1[:,3],'r')
plt.plot(x, pred,'g')
print(np.sum(abs(pred-co1[:,3]))/100)
# 如果要获取X的原型,使用如下方法即可
X_Ori = sca.inverse_transform(X) 
# 后面如果需要对其他样本进行预测,对应的都需要使用该训练好的归一化容器进行设置
x_test = sca.transform(x_test)   

预测结果还是可以的平均偏差为0.98
在这里插入图片描述

情况2-只对特征和标签同时归一化

对特征和标签同时归一化,使用相同的模型时,效果相对较差,倾向于不对标签值进行归一化,这里对整理归一化作个说明,具体如何选择,在学习中。
特征X 和 标签y同时进行归一化有两种方式,这里是第一种方式,如下所示,把特征和标签当做一个整体,进行归一化fit并transform。最后通过获取该列标签对应的归一化常量,对预测值进行反归一化,

x = range(100)
co2 = co.copy()
sca = MinMaxScaler()
co2 = sca.fit_transform(co2)
model = LinearRegression()
mo =model.fit(co2[:,0:3],co2[:,1])
p = mo.score(co2[:,0:3], co2[:,1])
pred = mo.predict(co2[:,0:3])
plt.figure(figsize=(13,2))
plt.plot(x, co2[:,3],'r')
plt.plot(x, pred,'g')
''' 如下所示第一个图,为归一化后的预测值和实际值"""

同时归一化后预测值和实际值的平均偏差 
0.25924477465708706

在这里插入图片描述
“”“进行反归一化”""
data1 = sca.inverse_transform(co2)
y = data1[:,3]
y_pred =pred
maxs = sca.data_max_[-1] # 获取原始数据最后一列的最大值
mins = sca.data_min_[-1] # 获取原始数据最后一列的最小值
y_pred = y_pred*(maxs-mins)+mins
plt.figure(figsize=(13,2))
plt.plot(x, y,‘r’)
plt.plot(x, y_pred,‘g’)
print(np.sum(abs(pred-co2[:,3]))/100)`
``

在这里插入图片描述
注意:这里的整体数据分布不会改变,只是反归一化后的值需要添加(maxs-mins)的影响

情况3-分别对特征和标签同时归一化

这里是参考stackoverflow中的回答,就是分别进行归一化,定义两个不同的容器分别进行相应的操作。
按理说,sklearn中的归一化的方法是分别对每个特征分别进行操作,所以即使是不同的容器,应该跟上述情况3的结果差异较小,但是,实际操作中,最后的差异还是蛮大的。

x0 = range(100)
co3 = co.copy()
s1 = MinMaxScaler()
s2 = MinMaxScaler()
x = s1.fit_transform(co3[:,0:3])
y = s2.fit_transform(co3[:,3].reshape(100,1))

model = LinearRegression()
mo =model.fit(x,y)
p = mo.score(x,y)
pred = mo.predict(x)

plt.figure(figsize=(13,2))
plt.plot(x0, pred,'r')
plt.plot(x0, y,'g')
print(np.sum(abs(pred-y))/100)

在这里插入图片描述
再分别进行反归一化

y0 = s2.inverse_transform(y)
ypre = s2.inverse_transform(pred)

plt.figure(figsize=(13,2))
plt.plot(x0, y0,'r')
plt.plot(x0, ypre,'g')
print(np.sum(abs(y0-ypre))/100)

在这里插入图片描述

总结

建议是分别设置2个容器,一个给X,一个给y。也方便最后进行反归一化。
另外也可以选择对某个特征进行反归一化:

sca.inverse_transform(co2)[:,0]

即选择第一列数据反归一化,inverse里的数据是整体数据,就是你当时归一化输入多少维度(这里的维是列数)

以下是一个简单的 RNN 多输出预测归一化及计算平均绝对误差和均方误差的 Python 代码示例: ```python import numpy as np # 定义归一化函数 def denormalize(normalized_data, data_min, data_max): denormalized_data = normalized_data * (data_max - data_min) + data_min return denormalized_data # 定义计算平均绝对误差和均方误差函数 def calculate_errors(predicted_data, true_data): mae = np.mean(np.abs(predicted_data - true_data)) mse = np.mean(np.square(predicted_data - true_data)) return mae, mse # 假设有 10 个时间步长,每个时间步长有 3 个输出 time_steps = 10 num_outputs = 3 # 假设模型的输出为归一化后的数据,范围为 [0, 1] predicted_data_normalized = np.random.rand(time_steps, num_outputs) # 假设真实数据也为归一化后的数据,范围为 [0, 1] true_data_normalized = np.random.rand(time_steps, num_outputs) # 假设真实数据的最小值和最大值为 0 和 1,用于归一化 data_min = 0 data_max = 1 # 归一化预测数据和真实数据 predicted_data = denormalize(predicted_data_normalized, data_min, data_max) true_data = denormalize(true_data_normalized, data_min, data_max) # 计算平均绝对误差和均方误差 mae, mse = calculate_errors(predicted_data, true_data) # 输出结果 print("Predicted data:") print(predicted_data) print("True data:") print(true_data) print("MAE:", mae) print("MSE:", mse) ``` 需要注意的是,此示例中假设数据已经归一化并且最小值和最大值已知。如果数据没有归一化,则需要在进行归一化之前进行标准化。另外,此示例中计算的是平均绝对误差和均方误差,还可以根据需求计算其他误差指标。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值