天天看點

一文弄懂特征縮放(歸一化/正則化)

引言

特征縮放是機器學習預處理資料中最重要的步驟之一,它有時能決定學習模型的好壞。

特征縮放的作用如下:

  1. 加快梯度下降
  2. 提升模型精度(消除不同量綱)
  3. 防止梯度爆炸(消除過大值的影響)

為什麼要特征縮放

在機器學習算法處理資料時通常是忽略資料的機關資訊的,或者說不知道這些資料代表什麼。比如50kg和50公裡代表着兩個不同的度量,人類是很容易區分它們的。但是對于機器來說,這兩個資料是一樣的。

import pandas as pd
import numpy as np
data = np.array([[1,172,30000],[2,160,60000],[3,175,50000],[4,180,5000]])

df = pd.DataFrame(data,columns=['staff','height','salary'])      
一文弄懂特征縮放(歸一化/正則化)

我們來看下上面的表格,上面是員工身高與薪水的表格。我們人類看到數字172(cm)知道就是身高,看到5000知道肯定是薪水。但是機器就不知道。

假設用神經網絡來學習這份資料,那麼就會導緻取值範圍更大的薪水會主導模型的訓練,也就是模型會偏向于薪水,但通常我們不希望我們的算法一開始就偏向于某個特征。

假設我們嘗試計算兩個員工的歐氏距離,在特征縮放之前的結果是:

員工1和員工2的距離:

員工2和員工3的距離:

從上面的結果可以看到它們的距離基本上就是薪水的內插補點。

而在經過最大最小值歸一化後(下文會講到)的結果是:

員工1和員工2的距離:

員工2和員工3的距離:

顯然經過特征縮放後的結果更具有可比性。

這個問題不僅會出現在神經網絡裡面,還會出現在任何基于距離計算的算法中。特征縮放就可以解決這個問題。

特征縮放有哪些方法

有很多種特征縮放的方法,我們一一來分析。

均值歸一化(Mean Normalization)

将數值範圍縮放到區間裡,資料的均值變為

以上面的例子說明,假設我們要均值歸一化員工1的薪水。那麼

下面是對薪水和身高進行均值歸一化的結果:

data_mean = data[:,1:]
data_mean = (data_mean - data_mean.mean(axis=0)) / (data_mean.max(axis=0) - data_mean.min(axis=0))

pd.DataFrame(np.c_[np.arange(1,5),data_mean],columns=['staff','height','salary'])      
一文弄懂特征縮放(歸一化/正則化)

最大最小值歸一化(Min-Max Normalization)

最大最小值歸一化簡稱為歸一化,将數值範圍縮放到區間裡

以上面的例子說明,假設我們要最大最小值歸一化員工1的薪水。那麼

下面是對薪水和身高進行均最大最小值歸一化的結果:

data_min_max = data[:,1:]
data_min_max = (data_min_max - data_min_max.min(axis=0)) / (data_min_max.max(axis=0) - data_min_max.min(axis=0))

pd.DataFrame(np.c_[np.arange(1,5),data_min_max],columns=['staff','height','salary'])      
一文弄懂特征縮放(歸一化/正則化)

标準化/z值歸一化(Standardization/Z-Score Normalization)

标準化又叫z值歸一化,将數值縮放到0附近,且資料的分布變為均值為0,标準差為1的标準正态分布。

是的标準差,計算公式為:

以上面的例子說明,假設我們要标準化員工1的薪水。那麼

下面是對薪水和身高進行标準化的結果:

data_std = data[:,1:]
data_std = (data_std - data_std.mean(axis=0)) / (data_std.std(axis=0))

pd.DataFrame(np.c_[np.arange(1,5),data_std],columns=['staff','height','salary'])      
一文弄懂特征縮放(歸一化/正則化)

常見問題&注意事項

哪些算法需要特征縮放

特征縮放對基于距離的算法特别重要。是以像KNN、線性回歸、邏輯回歸、SVM等都需要特征縮放。

不基于距離的算法像樸素貝葉斯以及基于樹結構的算法(決策樹、随機森林)等不需要特征縮放。

歸一化還是标準化

  • 如果你知道資料分布不是正态分布,那麼使用歸一化。像用在KNN和NN這種不假設資料分布的算法就很合适。 最大最小值歸一化容易受異常值影響,常用于歸一化圖像的灰階值。
  • 當資料是正态分布時進行标準化是很有幫助的,不像歸一化,标準化的資料沒有限定範圍,對異常值不敏感。
  • 然後,具體的選擇還是依賴于你的資料或算法,通常最好歸一化和标準化都嘗試一下,看哪種方法好。

注意事項

參考

  1. ​​https://www.analyticsvidhya.com/blog/2020/04/feature-scaling-machine-learning-normalization-standardization​​
  2. ​​https://machinelearningknowledge.ai/feature-scaling-machine-learning/​​

繼續閱讀