1. 程式人生 > >資料變換-歸一化與標準化

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

> **公號:碼農充電站pro** > **主頁:** 一般在機器學習的**模型訓練**之前,有一個比較重要的步驟是**資料變換**。 因為,一般情況下,原始資料的各個特徵的值並不在一個統一的範圍內,這樣資料之間就沒有**可比性**。 資料變換的目的是**將不同渠道,不同量級的資料轉化到統一的範圍之內,方便後續的分析處理**。 資料變換的方法有很多,比如**資料平滑,資料聚集,資料概化,資料規範化**和**屬性構造**等。 本篇文章主要介紹資料規範化,這是一種比較常用,也比較簡單的方法。 資料規範化是**使屬性資料按比例縮放,這樣就將原來的數值對映到一個新的特定區域中**,包括**歸一化,標準化**等。 ### 1,資料歸一化 歸一化就是獲取原始資料的最大值和最小值,然後把原始值線性變換到 **[0,1]** 範圍之內,變換公式為: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201127162915978.png) 其中: - `x` 是當前要變換的原始值。 - `min` 是當前特徵中的最小值。 - `max` 是當前特徵中的最大值。 - `x'` 是變換完之後的新值。 >
**注意:** > `min` 和 `max` 是指當前特徵中的最小最大值。 > 所以同一特徵之內,最小最大值是一樣的。 > 而不同特徵之間,最小最大值是不一樣的。 從公式中可以看出,歸一化與最大最小值有關,這也是歸一化的缺點,因為最大值與最小值非常容易受**噪音資料**的影響。 #### 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](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler) 類就是用來做歸一化處理的。 首先引入 `MinMaxScaler` 類: ```shell >
>> from sklearn.preprocessing import MinMaxScaler ``` 準備要變換的 `data` 資料,並初始化 `MinMaxScaler` 物件: ```shell >>> data = [[5, 465, 135], [23, 378, 69], [69, 796, 83]] >>> scaler = MinMaxScaler() # 預設將資料擬合到 [0, 1] 範圍內 ``` 擬合數據: ```shell >>> scaler.fit(data) ``` 輸出每個特徵的最大最小值: ```shell >>> scaler.data_max_ # 特徵最大值 array([ 69., 796., 135.]) >
>> scaler.data_min_ # 特徵最小值 array([ 5., 378., 69.]) ``` 變換所有資料: ```shell >>> scaler.transform(data) array([[0. , 0.20813397, 1. ], [0.28125 , 0. , 0. ], [1. , 1. , 0.21212121]]) ``` 可以對比我們計算的第一行資料,結果是一樣的。 > 可以用一個`fit_transform` 方法,來替換兩個方法`fit` 和 `transform`。 ### 2,資料標準化 **z-score 標準化**是基於正態分佈的,該方法假設資料呈現**標準正態分佈**。 #### 2.1,什麼是正態分佈 **正態分佈也叫高斯分佈**,是**連續隨機變數**概率分佈的一種,它的數學公式是: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201127171921330.png) 其中,**u** 為**均值**(平均數),**σ** 為**標準差**。均值和標準差是正態分佈的關鍵引數,它們會決定分佈的具體形態。 正態分佈有以下特點: - 正態分佈以經過均值 **u** 的垂線為軸,左右對稱展開,中間點最高,然後逐漸向兩側下降。 - 分佈曲線和 **X** 軸組成的面積為 **1**,表示所有事件出現的概率總和為 **1**。 正態分佈就是常態分佈,正常狀態的分佈。在現實生活中,大量隨機現象的資料分佈都近似於正態分佈。 正態分佈的分佈圖為: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020112717373333.png?) 當 **μ** 為 **0**,**σ** 為 **1**時,正態分佈為**標準正態分佈**。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201127172934233.png?) 圖中的百分數表示所在面積佔總面積的百分比。 #### 2.2,z-score 標準化 **z-score 標準化**利用正態分佈的特點,**計算一個給定分數距離平均數有多少個標準差**。它的轉換公式如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201127174826563.png) 其中 **x** 為原始值,**u** 為均值,**σ** 為標準差,**x’** 是變換後的值。 經過 **z-score 標準化**後,高於平均數的分數會得到一個正的標準分,而低於平均數的分數會得到一個負的標準分數。 和歸一化相比,**z-score 標準化**不容易受到噪音資料的影響,並且保留了各維特徵對目標函式的影響權重。 #### 2.3,使用 StandardScaler 類 **sklearn** 庫的 **preprocessing** 模組中的 [StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler) 類就是用來做**z-score 標準化**處理的。 首先引入 `StandardScaler` 類: ```shell >>> from sklearn.preprocessing import StandardScaler ``` 準備要變換的 `data` 資料,並初始化 `StandardScaler` 物件: ```shell >>> data = [ [5, 465, 135], [23, 378, 69], [69, 796, 83] ] >>> scaler = StandardScaler() ``` 擬合數據: ```shell >>> scaler.fit(data) ``` 輸出每個特徵的均值和標準差: ```shell >>> scaler.mean_ # 均值 array([ 32.33333333, 546.33333333, 95.66666667]) >>> scaler.scale_ # 標準差 array([ 26.94851058, 180.078378 , 28.39405259]) ``` 變換所有資料: ```shell >>> 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](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler) 類的使用。 - 標準化:介紹了 **z-score 標準化**,原始資料經過轉換後,符合標準正態分佈。 - 和歸一化相比,**z-score 標準化**不容易受到噪音資料的影響。 - 介紹了 [StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler) 類的使用。 資料變換不一定能提高模型的準確度,但是會提高資料的可解釋性。 需要注意的是,對訓練資料進行了資料變換之後,在測試模型準確度或者預測資料之前,也要對資料進行同樣的資料變換。 (本節完。) --- **推薦閱讀:** [***決策樹演算法-理論篇-如何計算資訊純度***](https://www.cnblogs.com/codeshell/p/13948083.html) [***決策樹演算法-實戰篇-鳶尾花及波士頓房價預測***](https://www.cnblogs.com/codeshell/p/13984334.html) [***樸素貝葉斯分類-理論篇-如何通過概率解決分類問題***](https://www.cnblogs.com/codeshell/p/13999440.html) [***樸素貝葉斯分類-實戰篇-如何進行文字分類***](https://www.cnblogs.com/codeshell/p/14034097.html) [***計算機如何理解事物的相關性-文件的相似度判斷***](https://www.cnblogs.com/codeshell/p/14046415.html) --- 歡迎關注作者公眾號,獲取更多技術乾貨。 ![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic_center)