【關於歸一化與反歸一化數據統一的問題】:訓練集與測試集必須使用同一參數的歸一化與反歸一化

問題描述:
在建立迴歸模型時,往往需要對數據進行歸一化和反歸一化。
然而,一定要注意訓練集與測試集使用的歸一化參數必須統一!!
常用的歸一化方法有很多,這裏以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或其他庫的歸一化和反歸一化方法原理大致相同,只要把握以上兩點即可。訓練集、測試集、歸一化、反歸一化 均要使用同一參數的歸一化函數!!

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