【关于归一化与反归一化数据统一的问题】:训练集与测试集必须使用同一参数的归一化与反归一化

问题描述:
在建立回归模型时,往往需要对数据进行归一化和反归一化。
然而,一定要注意训练集与测试集使用的归一化参数必须统一!!
常用的归一化方法有很多,这里以sklearn的MinMaxScale()为例,下面讲述了归一化和反归一化在建模中的详细过程

先看一个最普通的归一化例子:

import numpy as np
from sklearn.preprocessing import MinMaxScaler #导入库

data = np.random.randint(0,5,size=5) #随机生成长度为5的数据
m = MinMaxScaler() #建立一个归一化器
data_1 = m.fit_transform(data) #利用m对data进行归一化,并储存data的归一化参数
data_2 = m.inverse_transform(data_1) #利用m对data_1进行反归一化

上面例子只有一组数据data,对data进行归一化,再进行反归一化,流程正确,但在实际建模中几乎不存在这种简单的操作。

因此在正常建模时,对测试集和训练集进行归一化和反归一化时,应执行如下代码:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 建立数据集:假设训练集有10个样本,测试集有5个样本;两个输入特征,一个输出
train_data = np.random.randint(5,size=(10,3))
test_data = np.random.randint(5,size=(5,3))
train_data = pd.DataFrame(train_data ,columns = ['output','input1','input2'])
test_data = pd.DataFrame(test_data ,columns = ['output','input1','input2'])

# 对训练集和测试集进行归一化
mm = MinMaxScaler()
train_data_m = mm.fit_transform(train_data.values) #注意fit_transform() 和 transform()的区别
test_data_m = mm.transform(test_data.values) #注意fit_transform() 和 transform()的区别

# ...假设这里经过模型训练,得到了模型model;
# 这里model_fit()和model.predict()是假设的模型训练函数和预测函数
model = model_fit(train_data_m) #训练模型
predicted_y_m = model.predict(test_data_m[:,[1,2]]) #利用输入特征input1和input2测试模型
# 这里predicted_y_m.shape为(5,),例如:array([0.1, 0.2, 0.3, 0.54, 0.5])

# 预测结果反归一化
	#先将预测数据设定为前面归一化时设定的维度
predicted_data_m = test_data_m  #将归一化后的test_data_m赋给predicted_data_m
predicted_data_m [:,0] = predicted_y #将第1列的真实值改为预测值
	#归一化
predicted_data = mm.inverse_transform(predicted_data_m) #反归一化

# 预测结果为:
predicted_y = predicted_data[:,0]

这里重点需要关注的有两点;
第一点: fit_transform() 和 transform()的区别。两者都是归一化函数,但是fit_transform() 会储存归一化函数是的相关参数,因此对训练集使用fit_transform() ,储存了训练集归一化的相关参数,然后利用这些参数对测试集进行统一的归一化transform()【切记不能再使用fit_transform() ,第二次使用fit_transform() 会刷新mm里储存的参数!!】
第二点: 反归一化时任然要使用归一化时储存的参数和格式。归一化时使用的是mm = MinMaxScaler(),因此后面仍然要使用mm进行反归一化;归一化时fit_transform(train_data.values) 中的train_data.values是n3维度(这里10个样本,即为103)的数组,因此反归一化时的数据也必须是3列,即m*3(m为测试集样本数,这里为5)

以上就是以sklearn.preprocessing.MinMaxScaler为例的归一化和反归一化方法。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章