首頁 > 軟體

資料變換-歸一化與標準化

2020-11-30 11:30:48

公號:碼農充電站pro
主頁:https://codeshellme.github.io

一般在機器學習的模型訓練之前,有一個比較重要的步驟是資料變換

因為,一般情況下,原始資料的各個特徵的值並不在一個統一的範圍內,這樣資料之間就沒有可比性

資料變換的目的是將不同渠道,不同量級的資料轉化到統一的範圍之內,方便後續的分析處理

資料變換的方法有很多,比如資料平滑,資料聚集,資料概化,資料規範化屬性構造等。

本篇文章主要介紹資料規範化,這是一種比較常用,也比較簡單的方法。

資料規範化是使屬性資料按比例縮放,這樣就將原來的數值對映到一個新的特定區域中,包括歸一化,標準化等。

1,資料歸一化

歸一化就是獲取原始資料的最大值和最小值,然後把原始值線性變換到 [0,1] 範圍之內,變換公式為:


其中:

  • x 是當前要變換的原始值。
  • min 是當前特徵中的最小值。
  • max 是當前特徵中的最大值。
  • x' 是變換完之後的新值。

注意:
minmax 是指當前特徵中的最小最大值。
所以同一特徵之內,最小最大值是一樣的。
而不同特徵之間,最小最大值是不一樣的。

從公式中可以看出,歸一化與最大最小值有關,這也是歸一化的缺點,因為最大值與最小值非常容易受噪音資料的影響。

1.1,歸一化處理

比如,我們有以下資料:

編號 特徵1 特徵2 特徵3
第1條 5 465 135
第2條 23 378 69
第3條 69 796 83

通過資料可以觀察出:

  • Max(特徵1) = 69,Min(特徵1) = 5
  • Max(特徵2) = 796,Min(特徵2) = 378
  • Max(特徵3) = 135,Min(特徵3) = 69

這裡我們用第一條資料來舉例,看看是如何變換的。

  • 對於第一個數位 5 做變換:(5 - 5) / (69 - 5) = 0
  • 對於第二個數位 465 做變換:(465 - 378) / (796 - 378) = 0.21
  • 對於第三個數位 135 做變換:(135 - 69) / (135 - 69) = 1

1.2,使用 MinMaxScaler 類

sklearn 庫的 preprocessing 模組中的 MinMaxScaler 類就是用來做歸一化處理的。

首先引入 MinMaxScaler 類:

>>> from sklearn.preprocessing import MinMaxScaler

準備要變換的 data 資料,並初始化 MinMaxScaler 物件:

>>> data = [[5, 465, 135], [23, 378, 69], [69, 796, 83]]
>>> scaler = MinMaxScaler() # 預設將資料擬合到 [0, 1] 範圍內

擬合資料:

>>> scaler.fit(data)

輸出每個特徵的最大最小值:

>>> scaler.data_max_         # 特徵最大值
array([ 69., 796., 135.])
>>> scaler.data_min_         # 特徵最小值
array([  5., 378.,  69.])

變換所有資料:

>>> scaler.transform(data)
array([[0.        , 0.20813397, 1.        ],
       [0.28125   , 0.        , 0.        ],
       [1.        , 1.        , 0.21212121]])

可以對比我們計算的第一行資料,結果是一樣的。

可以用一個fit_transform 方法,來替換兩個方法fittransform

2,資料標準化

z-score 標準化是基於正態分佈的,該方法假設資料呈現標準正態分佈

2.1,什麼是正態分佈

正態分佈也叫高斯分佈,是連續隨機變數概率分佈的一種,它的數學公式是:

其中,u均值(平均數),σ標準差。均值和標準差是正態分佈的關鍵引數,它們會決定分佈的具體形態。

正態分佈有以下特點:

  • 正態分佈以經過均值 u 的垂線為軸,左右對稱展開,中間點最高,然後逐漸向兩側下降。
  • 分佈曲線和 X 軸組成的面積為 1,表示所有事件出現的概率總和為 1

正態分佈就是常態分佈,正常狀態的分佈。在現實生活中,大量隨機現象的資料分佈都近似於正態分佈。

正態分佈的分佈圖為:

μ0σ1時,正態分佈為標準正態分佈

圖中的百分數表示所在面積佔總面積的百分比。

2.2,z-score 標準化

z-score 標準化利用正態分佈的特點,計算一個給定分數距離平均數有多少個標準差。它的轉換公式如下:

其中 x 為原始值,u 為均值,σ 為標準差,x’ 是變換後的值。

經過 z-score 標準化後,高於平均數的分數會得到一個正的標準分,而低於平均數的分數會得到一個負的標準分數。

和歸一化相比,z-score 標準化不容易受到噪音資料的影響,並且保留了各維特徵對目標函數的影響權重。

2.3,使用 StandardScaler 類

sklearn 庫的 preprocessing 模組中的 StandardScaler 類就是用來做z-score 標準化處理的。

首先引入 StandardScaler 類:

>>> from sklearn.preprocessing import StandardScaler

準備要變換的 data 資料,並初始化 StandardScaler 物件:

>>> data = [
 [5, 465, 135], 
 [23, 378, 69], 
 [69, 796, 83]
 ]
>>> scaler = StandardScaler() 

擬合資料:

>>> scaler.fit(data)

輸出每個特徵的均值和標準差:

>>> scaler.mean_   # 均值
array([ 32.33333333, 546.33333333,  95.66666667])
>>> scaler.scale_  # 標準差
array([ 26.94851058, 180.078378  ,  28.39405259])

變換所有資料:

>>> scaler.transform(data)
array([[-1.01427993, -0.45165519,  1.38526662],
       [-0.34633949, -0.93477815, -0.93916381],
       [ 1.36061941,  1.38643334, -0.44610281]])

3,總結

資料變換的目的是將不同渠道,不同量級的資料轉化到統一的範圍之內,方便後續的分析處理

不同的機器學習演演算法,對資料有不同的要求,所以要針對不同的演演算法,對原始資料進行不同的轉換。

資料規範化是常用的資料變化方法,包括歸一化和標準化等:

  • 歸一化:使用特徵值中的最大最小值,把原始值轉換為 0 到 1 之間的值。
    • 優點:是簡單易行,好理解。
    • 缺點:是容易受最大最小值的干擾。
    • 介紹了 MinMaxScaler 類的使用。
  • 標準化:介紹了 z-score 標準化,原始資料經過轉換後,符合標準正態分佈。
    • 和歸一化相比,z-score 標準化不容易受到噪音資料的影響。
    • 介紹了 StandardScaler 類的使用。

資料變換不一定能提高模型的準確度,但是會提高資料的可解釋性。

需要注意的是,對訓練資料進行了資料變換之後,在測試模型準確度或者預測資料之前,也要對資料進行同樣的資料變換。

(本節完。)


推薦閱讀:

決策樹演演算法-理論篇-如何計算資訊純度

決策樹演演算法-實戰篇-鳶尾花及波士頓房價預測

樸素貝葉斯分類-理論篇-如何通過概率解決分類問題

樸素貝葉斯分類-實戰篇-如何進行文字分類

計算機如何理解事物的相關性-檔案的相似度判斷


歡迎關注作者公眾號,獲取更多技術乾貨。


IT145.com E-mail:sddin#qq.com