數據規范化就是消除量綱的影響,這點很重要。
對算法的作用
在以梯度和矩陣為核心的算法中,譬如邏輯回歸、神經網絡、svm,規范化能加快求解速度,
在以距離計算為核心的算法中,譬如KNN、Kmeans,規范化能提高模型的精度,
在樹模型中,無需規范化。
概述
數據規范化有很多種方法,總體可以分為線性的和非線性的,線性的規范化包括中心化處理和縮放處理,中心化是把數據減去某個值, 以平移到某個位置,縮放是把數據除以某個值,把數據固定在某個范圍。取log也是一種縮放處理。
常用的數據規范化方法有歸一化、標准化、極差標准化、log等
歸一化
x-min/max-min,把數據規范在(0, 1)之間,當然也可以是其他范圍
歸一化容易受到異常值的影響,所以一般不是首選,如果標准化效果不好時,可以試試歸一化
在不涉及梯度、矩陣、距離的算法中,可以先試試歸一化,如圖像處理
示例代碼
import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler np.set_printoptions(2) np.random.seed(10) data = np.random.uniform(-5, 5, size=(100, 1)) # 注意數據必須是2維的 data = np.random.normal(-5, 5, size=(100, 1)) print(data.T) plt.plot(data, '.') # 歸一化 scaler = MinMaxScaler() scaler = scaler.fit(data) data2 = scaler.transform(data) print(data2.T) plt.plot(data2, 'ro') # 數據還原 old_data = scaler.inverse_transform(data2) # 逆操作 print(old_data.T) # 歸一化到指定范圍 scaler2 = MinMaxScaler(feature_range=[2, 4]) # 歸一到指定范圍內 scaler2.fit(old_data) data3 = scaler2.transform(old_data) plt.plot(data3, 'y*') plt.show() # 當特征很多時,fit會報錯,表示計算不了,此時用 partial_fit scaler3 = MinMaxScaler() scaler3.partial_fit(data) data4 = scaler3.transform(data) print(data4.T)
MinMaxScaler fit transform fit_transform inverse_transform partial_fit
標准化
通常說的標准化是指標准差標准化,即 x-mean/std
std在一定程度上代表了數據的"跨度",可以理解為取值范圍,也可以理解為量綱,除以標准差就是消除量綱
也可以做一些其他嘗試,比如 x-min/std,這叫正規化
x-mean/max-min,這叫極差標准化
示例代碼
import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler np.set_printoptions(precision=2) np.random.seed(10) data = np.random.uniform(-5, 5, size=(100, 1)) print(data.T) plt.plot(data, '.') scaler = StandardScaler() scaler.fit(data) print(scaler.mean_) # [-0.15] print(scaler.var_) # [7.56] data = scaler.transform(data) print(data.mean()) # -1.97064586871e-17 0 print(data.var()) # 1 old_data = scaler.inverse_transform(data) print(old_data.T) plt.plot(data, 'ro') plt.show()
另一個函數實現標准化
import numpy as np from sklearn.preprocessing import MinMaxScaler, StandardScaler, scale data = np.random.uniform(-5, 5, size=(20, 1)) data1 = MinMaxScaler().fit_transform(data) print(data1.T) data2 = StandardScaler().fit_transform(data) print(data2.T) data3 = scale(data) print(data3.T) # ==data2
還有很多不太常用的,sklearn也提供了API