標籤:mod 定義 歸一化 高斯 nump scale generated 效果 表示
特徵歸一化有很多不同的叫法,比如:特徵縮放,Feature Normalization,Feature Scaling
資料標準化(歸一化)處理是資料採礦的一項基礎工作,不同評價指標往往具有不同的量綱和量綱單位,這樣的情況會影響到資料分析的結果,為了消除指標之間的量綱影響,需要進行資料標準化處理,以解決資料指標之間的可比性。未經處理資料經過資料標準化處理後,各指標處於同一數量級,適合進行綜合對比評價。
特徵歸一化的意義
- 各特徵之間的大小範圍一致,才能使用距離度量等演算法
- 加速梯度下降演算法的收斂
- 在SVM演算法中,一致化的特徵能加速尋找支援向量的時間
- 不同的機器學習演算法,能接受的輸入數值範圍不一樣
以下是兩種常用的歸一化方法:
- Min-Max標準化(Min-Max Normalization)線性歸一化
稱為離差標準化,是對未經處理資料的線性變換,使結果值對應到[0 1]之間。轉換函式如下:
x^*=\frac{x-min}{max-min}
該方法實現對未經處理資料的等比例縮放,其中x^*為歸一化後的資料,x為未經處理資料,max為樣本資料的最大值,min為樣本資料的最小值。
缺點:
- 當有新資料加入時,可能導致max和min的變化,需要重新定義。
- 資料不穩定,存在異常值和較多噪音
優點:
- 當我們需要將特徵值都歸一化為某個範圍[a,b]時,選MinMaxScaler
- 0均值標準化(Z-score standardization)
這種方法給予未經處理資料的均值(mean)和標準差(standard deviation)進行資料的標準化。將未經處理資料集歸一化為均值為0、方差1的資料集,轉化函數為:
x^*=\frac{x-\mu}{\delta}
其中μ、δ分別為未經處理資料集的均值和方法。該種歸一化方式要求未經處理資料的分布可以近似為高斯分布,否則歸一化的效果會變得很糟糕。
優點:
- 比較
以上為兩種比較普通但是常用的歸一化技術,那這兩種歸一化的應用情境是怎麼樣的呢?什麼時候第一種方法比較好、什麼時候第二種方法比較好呢?下面做一個簡要的分析概括:
- 在分類、聚類演算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score
standardization)表現更好。
- 在不涉及距離度量、共變數計算、資料不符合正太分布的時候,可以使用第一種方法或其他歸一化方法。比像處理中,將RGB映像轉換為灰階映像後將其值限定在[0
255]的範圍。
下面用Python來實現上述
舉例:假設有4個樣本及他們的特徵如下
樣本 | 特徵1 | 特徵2
---|---|---
1 | 10001 | 2
2 | 16020 | 4
3 | 12008 | 6
4 | 13131 | 8
可見歸一化前,特徵1和特徵2的大小不是一個數量級。歸一化後,特徵變為
| 樣本 |
特徵1 |
特徵2 |
| 1 |
0 |
0 |
| 2 |
1 |
0.33 |
| 3 |
0.73 |
0.67 |
| 4 |
0.81 |
1 |
min-max標準化(Min-Max Normalization)線性歸一化
sklearn.preprocessing.MinMaxScaler
在sklearn中,sklearn.preprocessing.MinMaxScaler是一種用於特徵歸一化的方法。使用樣本如下
from sklearn.preprocessing import MinMaxScalerx = [[10001,2],[16020,4],[12008,6],[13131,8]]min_max_scaler = MinMaxScaler()X_train_minmax = min_max_scaler.fit_transform(x)#歸一化後的結果X_train_minmaxarray([[ 0. , 0. ], [ 1. , 0.33333333], [ 0.33344409, 0.66666667], [ 0.52001994, 1. ]])
它預設將每種特徵的值都歸一化到[0,1]之間,歸一化後的數值大小範圍是可調的(根據MinMaxScaler的參數feature_range調整)。下面代碼能將特徵歸一化到[-1,1]之間。
min_max_scaler = MinMaxScaler(feature_range=(-1,1))X_train_minmax = min_max_scaler.fit_transform(x)#歸一化後的結果X_train_minmaxarray([[-1. , -1. ], [ 1. , -0.33333333], [ 0.46574339, 0.33333333], [ 0.6152873 , 1. ]])
MinMaxScaler的實現公式如下
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))X_scaled = X_std * (max - min) + min
這是向量化的表達方式,說明X是矩陣,其中
- X_std:將X歸一化到[0,1]之間
- X.min(axis=0)表示列最小值
- max,min表示
MinMaxScaler的參數feature_range參數。即最終結果的大小範圍
以下例說明計算過程(max=1,min=0)
樣本 | 特徵1 | 特徵2
---|---|---
1 | 10001 | 2
2 | 16020 | 4
3 | 12008 | 6
4 | 13131 | 8
X.max | 16020 | 8
X.min | 10001 | 2
歸一化的過程如下,假設歸一化後的矩陣為S
- S11=(10001-10001)/(16020-10001)=0
- S21=(16020-10001)/(16020-10001)=1
- S31=(12008-10001)/(16020-10001)=0.333444
- S41=(13131-10001)/(16020-10001)=0.52002
- S12=(2-2)/(8-2)=0
- S22=(4-2)/(8-2)=0.33
- S32=(6-2)/(8-2)=0.6667
- S42=(8-2)/(8-2)=1
可見,結果與章節“MinMaxScaler使用”中的計算結果一致。
StandardScaler標準化方法 零均值歸一化
sklearn.preprocessing.StandardScaler
sklearn.preprocessing.robust_scale
在sklearn中,sklearn.preprocessing.StandardScaler是一種用於特徵歸一化的方法。使用樣本如下
from sklearn.preprocessing import StandardScalerx = [[10001,2],[16020,4],[12008,6],[13131,8]]X_scaler = StandardScaler()X_train = X_scaler.fit_transform(x)X_trainarray([[-1.2817325 , -1.34164079], [ 1.48440157, -0.4472136 ], [-0.35938143, 0.4472136 ], [ 0.15671236, 1.34164079]])
歸一化後,矩陣每列的均值為0,標準差為1。注意,這裡的標準差是指加了Delta Degrees of Freedom因子後的標準差,這與傳統的標準差計算公式有區別。(在numpy中,有std()函數用於計算標準差)
StandardScaler的歸一化方式是用每個特徵減去列均值,再除以列標準差。
以下例說明計算過程,注意標準差是用np.std()計算的。
| 樣本 |
特徵1 |
特徵2 |
| 1 |
10001 |
2 |
| 2 |
16020 |
4 |
| 3 |
12008 |
6 |
| 4 |
13131 |
8 |
| 列均值 |
12790 |
5 |
| 列標準差 |
2175.96 |
2.236 |
歸一化的過程如下,假設歸一化後的矩陣為S
- S11=(10001-12790)/2175.96=-1.28173
- S21=(16020-12790)/2175.96=1.484
- S31=(12008-12790)/2175.96=-0.35938
- S41=(13131-12790)/2175.96=0.1567
- S12=(2-5)/2.236=-1.342
- S22=(4-5)/2.236=-0.447
- S32=(6-5)/2.236=0.447
- S42=(8-5)/2.236=1.3416
2.1對 特徵歸一化 的一些理解