公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml
通常在機器學習的模型訓練以前,有一個比較重要的步驟是數據變換。git
由於,通常狀況下,原始數據的各個特徵的值並不在一個統一的範圍內,這樣數據之間就沒有可比性。github
數據變換的目的是將不一樣渠道,不一樣量級的數據轉化到統一的範圍以內,方便後續的分析處理。算法
數據變換的方法有不少,好比數據平滑,數據彙集,數據概化,數據規範化和屬性構造等。shell
本篇文章主要介紹數據規範化,這是一種比較經常使用,也比較簡單的方法。機器學習
數據規範化是使屬性數據按比例縮放,這樣就將原來的數值映射到一個新的特定區域中,包括歸一化,標準化等。函數
歸一化就是獲取原始數據的最大值和最小值,而後把原始值線性變換到 [0,1] 範圍以內,變換公式爲:學習
其中:測試
x
是當前要變換的原始值。min
是當前特徵中的最小值。max
是當前特徵中的最大值。x'
是變換完以後的新值。注意:
min
和max
是指當前特徵中的最小最大值。
因此同一特徵以內,最小最大值是同樣的。
而不一樣特徵之間,最小最大值是不同的。3d
從公式中能夠看出,歸一化與最大最小值有關,這也是歸一化的缺點,由於最大值與最小值很是容易受噪音數據的影響。
好比,咱們有如下數據:
編號 | 特徵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
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
方法,來替換兩個方法fit
和transform
。
z-score 標準化是基於正態分佈的,該方法假設數據呈現標準正態分佈。
正態分佈也叫高斯分佈,是連續隨機變量機率分佈的一種,它的數學公式是:
其中,u 爲均值(平均數),σ 爲標準差。均值和標準差是正態分佈的關鍵參數,它們會決定分佈的具體形態。
正態分佈有如下特色:
正態分佈就是常態分佈,正常狀態的分佈。在現實生活中,大量隨機現象的數據分佈都近似於正態分佈。
正態分佈的分佈圖爲:
當 μ 爲 0,σ 爲 1時,正態分佈爲標準正態分佈。
圖中的百分數表示所在面積佔總面積的百分比。
z-score 標準化利用正態分佈的特色,計算一個給定分數距離平均數有多少個標準差。它的轉換公式以下:
其中 x 爲原始值,u 爲均值,σ 爲標準差,x’ 是變換後的值。
通過 z-score 標準化後,高於平均數的分數會獲得一個正的標準分,而低於平均數的分數會獲得一個負的標準分數。
和歸一化相比,z-score 標準化不容易受到噪音數據的影響,而且保留了各維特徵對目標函數的影響權重。
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]])
數據變換的目的是將不一樣渠道,不一樣量級的數據轉化到統一的範圍以內,方便後續的分析處理。
不一樣的機器學習算法,對數據有不一樣的要求,因此要針對不一樣的算法,對原始數據進行不一樣的轉換。
數據規範化是經常使用的數據變化方法,包括歸一化和標準化等:
數據變換不必定能提升模型的準確度,可是會提升數據的可解釋性。
須要注意的是,對訓練數據進行了數據變換以後,在測試模型準確度或者預測數據以前,也要對數據進行一樣的數據變換。
(本節完。)
推薦閱讀:
歡迎關注做者公衆號,獲取更多技術乾貨。