特征工程中的「歸一化」有什麼作用? - 微調的回答 - 知乎 https://www.zhihu.com/question/20455227/answer/370658612
本文主要摘自知乎問題中微調童鞋的答案,侵删。
首先,我們需要明白三個問題:
- 資料縮放的本質是什麼
- 不同資料縮放的差別
- 如何選擇不同的縮放方法
我們從定義入手:
- 歸一化(normalization):
- 标準化(standardization):
其中
和
代表樣本的均值和标準差,
為最大值,
為最小值。
1. 歸一化和标準化本質上都是一種線性變換
先看歸一化,在資料給定的前提下,令常數
,常數
,那麼歸一化的新的形式就是
。在這種改寫後下,易發現和标準化形式
類似,因為在資料給定後
和
也可看做常數。
是以可以再稍微變形一下:
(公式1)
就發現事實上就是對向量
按照比例壓縮
再進行平移
。是以歸一化和标準化的本質就是一種線性變換。
舉個簡單的例子:
- 原始資料: ,其中 , ,
- 歸一化:代入公式1,将 壓縮4倍并平移 ,得到 ,最終有
- 标準化:與歸一化類似,略
2. 線性變化的性質
線性變換有很多良好的性質,這些性質決定了為什麼對資料進行改變後竟然不會造成“失效”,反而還能提高資料的表現。拿其中很重要的一個性質為例,線性變化不改變原始資料的數值排序。
下面舉個栗子:
from sklearn import preprocessing
from scipy.stats import rankdata
x = [[1], [3], [34], [21], [10], [12]]
std_x = preprocessing.StandardScaler().fit_transform(x) n
orm_x = preprocessing.MinMaxScaler().fit_transform(x)
# print(std_x)
# print(norm_x)
print('原始順序 :', rankdata(x))
print('标準化順序:', rankdata(std_x))
print('歸一化順序:', rankdata(norm_x))
發現兩種處理方法都不會改變資料的排序。對很多模型來說,這個性質保證了資料依然有意義,順序性不變,而不會造成了額外的影響。說白了,隻是因為線性變換保持線性組合與線性關系式不變,這保證了特定模型不會失效。
3. 歸一化和标準化的差別
我們已經說明了它們的本質是縮放和平移,但差別是什麼呢?在不涉及線性代數的前提下,我們給出一些直覺的解釋:歸一化的縮放是“拍扁”統一到區間(僅由極值決定),而标準化的縮放是更加“彈性”和“動态”的,和整體樣本的分布有很大的關系。值得注意:
- 歸一化:縮放僅僅跟最大、最小值的差别有關。
- 标準化:縮放和每個點都有關系,通過方差(variance)展現出來。與歸一化對比,标準化中所有資料點都有貢獻(通過均值和标準差造成影響)。
當資料較為集中時,
更小,于是資料在标準化後就會更加分散。如果資料本身分布很廣,那麼
較大,資料就會被集中到更小的範圍内。
從輸出範圍角度來看,
必須在0-1間。對比來看,顯然
,甚至在極端情況下
,是以标準化的輸出範圍一定比歸一化更廣。
- 歸一化: 輸出範圍在0-1之間
- 标準化:輸出範圍是負無窮到正無窮
4. 什麼時候用歸一化?什麼時候用标準化?
我們已經從第三部分得到了一些性質,是以可以得到以下結論:
- 如果對輸出結果範圍有要求,用歸一化
- 如果資料較為穩定,不存在極端的最大最小值,用歸一化
- 如果資料存在異常值和較多噪音,用标準化,可以間接通過中心化避免異常值和極端值的影響
5.最後補兩張圖,直覺了解一下: