1. 程式人生 > 其它 >歸一化Normalization、標準化Standardization和正則化Regularization

歸一化Normalization、標準化Standardization和正則化Regularization

一、歸一化Normalization和標準化Standardization

標準化和歸一化都是將原始資料縮放到一定範圍,都屬於特徵縮放的方法。

特徵縮放的作用是:

(1)使不同量綱的特徵處於同一數值量級,減少方差大的特徵的影響,使模型更準確。

(2)加快學習演算法的收斂速度。在使用梯度下降的方法求解最優化問題時, 歸一化/標準化後可以加快梯度下降的求解速度。

歸一化:

通常將特徵縮放到【0,1】

from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)

標準化:

標準化被廣泛用作許多學習演算法中的預處理步驟,以將特徵重新調整為零均值和單位方差。

μ和σ分別是樣本資料的均值(mean)和標準差(std)。標準化的作用是將原始資料對映到均值為 0,標準差為 1 的分佈上,得到的結果分佈和原分佈是一樣的,不一定是標準正態分佈。標準化並不能使資料處於[0,1]之間。

使用sklearn.preprocessing.scale()函式,可以直接將給定資料進行標準化。

 X_scaled = preprocessing.scale(X)

使用sklearn.preprocessing.StandardScaler類,使用該類的好處在於可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料。

scaler = preprocessing.StandardScaler().fit(X)
scaler.transform(X) # 可以直接使用訓練集對測試集資料進行轉換 print(scaler.transform([[-1., 1., 0.]]))

二、差異

(1)歸一化(Normalization)會嚴格的限定變換後資料的範圍,比如最大最小值處理的Normalization,它的範圍嚴格在[ 0 , 1 ]之間;而Standardization就沒有嚴格的區間,變換後的資料沒有範圍,只是其均值是0,標準差為1 。

(2)歸一化(Normalization)對資料的縮放比例僅僅和極值有關,就是說比如100個數,你除去極大值和極小值其他資料都更換掉,縮放比例是不變的;反觀,對於標準化如果除去極大值和極小值其他資料都更換掉,那麼均值和標準差大概率會改變,這時候,縮放比例自然也改變了。

三、歸一化和標準化選擇:

(1) 歸一化:

  要求資料範圍;

  使用PCA技術進行降維;

  在不涉及距離度量、協方差計算、資料不符合正太分佈的時候。

  (2) 標準化:

  資料不穩定,存在極端的最大最小值,不能使用歸一化;

  在分類、聚類演算法中,需要使用距離來度量相似性的時候。

  當原始資料不同維度特徵的尺度(量綱)不一致時,需要標準化步驟對資料進行標準化或歸一化處理,反之則不需要進行資料標準化。也不是所有的模型都需要做歸一的,比如模型演算法裡面有沒關於對距離的衡量,沒有關於對變數間標準差的衡量。比如決策樹,他採用演算法裡面沒有涉及到任何和距離等有關的,所以在做決策樹模型時,通常是不需要將變數做標準化的;另外,概率模型不需要歸一化,因為它們不關心變數的值,而是關心變數的分佈和變數之間的條件概率。

四、適用場景:

  不是所有的模型都需要做歸一的,比如模型演算法裡面有沒關於對距離的衡量,沒有關於對變數間標準差的衡量。比如決策樹,他採用演算法裡面沒有涉及到任何和距離等有關的,所以在做決策樹模型時,通常是不需要將變數做標準化的;另外,概率模型不需要歸一化,因為它們不關心變數的值,而是關心變數的分佈和變數之間的條件概率。


正則化Regularization

  與上面提到的特徵縮放技術不同,正則化旨在解決過擬合問題。通過在損失函式中增加額外的部分,學習演算法中的引數更有可能收斂到較小的值,這可以顯著減少過擬合。正則化主要有兩種基本型別:L1-範數和L2-範數(嶺迴歸)。

L1-範數:原始損失函式表示為 f(X),而新的是 F(X).

  當我們想要訓練稀疏模型時,L1 正則化更好,因為絕對值函式在 0 處不可微。

  L2-範數:在不適定問題中首選 L2 正則化以進行平滑處理。

# 使用L1正則化
from sklearn.preprocessing import Normalizer
normalizer = Normalizer(norm= 'l1')
X2 = normalizer.fit_transform(X)

# 使用L2正則化
from sklearn.preprocessing import normalize
X1 = normalize(X, norm = 'l2'

參考資料:

https://maristie.com/2018/02/Normalization-Standardization-and-Regularization

https://blog.csdn.net/keeppractice/article/details/109280623

https://blog.csdn.net/weixin_36604953/article/details/102652160