在對模型訓練時,為了讓模型盡快收斂,一件常做的事情就是對數據進行預處理。
這里通過使用sklearn.preprocess模塊進行處理。
一、標準化和歸一化的區別
歸一化其實就是標準化的一種方式,只不過歸一化是將數據映射到了[0,1]這個區間中。
標準化則是將數據按照比例縮放,使之放到一個特定區間中。標準化后的數據的均值=0,標準差=1,因而標準化的數據可正可負。
二、使用sklearn進行標準化和標準化還原
原理:
即先求出全部數據的均值和方差,再進行計算。
最后的結果均值為0,方差是1,從公式就可以看出。
但是當原始數據并不符合高斯分布的話,標準化后的數據效果并不好。
導入模塊
from sklearn.preprocessing import StandardScalerfrom sklearn.preprocessing import MinMaxScalerfrom matplotlib import gridspecimport numpy as npimport matplotlib.pyplot as plt
通過生成隨機點可以對比出標準化前后的數據分布形狀并沒有發生變化,只是尺度上縮小了。
cps = np.random.random_integers(0, 100, (100, 2)) ss = StandardScaler()std_cps = ss.fit_transform(cps) gs = gridspec.GridSpec(5,5)fig = plt.figure()ax1 = fig.add_subplot(gs[0:2, 1:4])ax2 = fig.add_subplot(gs[3:5, 1:4]) ax1.scatter(cps[:, 0], cps[:, 1])ax2.scatter(std_cps[:, 0], std_cps[:, 1]) plt.show()
sklearn.preprocess.StandardScaler的使用:
先是創建對象,然后調用fit_transform()方法,需要傳入一個如下格式的參數作為訓練集。
X : numpy array of shape [n_samples,n_features]Training set.data = np.random.uniform(0, 100, 10)[:, np.newaxis]ss = StandardScaler()std_data = ss.fit_transform(data)origin_data = ss.inverse_transform(std_data)print('data is ',data)print('after standard ',std_data)print('after inverse ',origin_data)print('after standard mean and std is ',np.mean(std_data), np.std(std_data))
通過invers_tainsform()方法就可以得到原來的數據。
打印結果如下:
可以看到生成的數據的標準差是1,均值接近0。
data is [[15.72836992] [62.0709697 ] [94.85738359] [98.37108557] [ 0.16131774] [23.85445883] [26.40359246] [95.68204855] [77.69245742] [62.4002485 ]]after standard [[-1.15085842] [ 0.18269178] [ 1.12615048] [ 1.22726043] [-1.59881442] [-0.91702287] [-0.84366924] [ 1.14988096] [ 0.63221421] [ 0.19216708]]after inverse [[15.72836992] [62.0709697 ] [94.85738359] [98.37108557] [ 0.16131774] [23.85445883] [26.40359246] [95.68204855] [77.69245742] [62.4002485 ]]after standard mean and std is -1.8041124150158794e-16 1.0
三、使用sklearn進行數據的歸一化和歸一化還原
新聞熱點
疑難解答