引言
特征縮放是機器學習預處理資料中最重要的步驟之一,它有時能決定學習模型的好壞。
特征縮放的作用如下:
- 加快梯度下降
- 提升模型精度(消除不同量綱)
- 防止梯度爆炸(消除過大值的影響)
為什麼要特征縮放
在機器學習算法處理資料時通常是忽略資料的機關資訊的,或者說不知道這些資料代表什麼。比如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這種不假設資料分布的算法就很合适。 最大最小值歸一化容易受異常值影響,常用于歸一化圖像的灰階值。
- 當資料是正态分布時進行标準化是很有幫助的,不像歸一化,标準化的資料沒有限定範圍,對異常值不敏感。
- 然後,具體的選擇還是依賴于你的資料或算法,通常最好歸一化和标準化都嘗試一下,看哪種方法好。
注意事項
參考
- https://www.analyticsvidhya.com/blog/2020/04/feature-scaling-machine-learning-normalization-standardization
- https://machinelearningknowledge.ai/feature-scaling-machine-learning/