公號:碼農充電站pro
主頁:https://codeshellme.github.io
一般在機器學習的模型訓練之前,有一個比較重要的步驟是數據變換。
因為,一般情況下,原始數據的各個特征的值並不在一個統一的范圍內,這樣數據之間就沒有可比性。
數據變換的目的是將不同渠道,不同量級的數據轉化到統一的范圍之內,方便后續的分析處理。
數據變換的方法有很多,比如數據平滑,數據聚集,數據概化,數據規范化和屬性構造等。
本篇文章主要介紹數據規范化,這是一種比較常用,也比較簡單的方法。
數據規范化是使屬性數據按比例縮放,這樣就將原來的數值映射到一個新的特定區域中,包括歸一化,標准化等。
1,數據歸一化
歸一化就是獲取原始數據的最大值和最小值,然后把原始值線性變換到 [0,1] 范圍之內,變換公式為:
其中:
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 類就是用來做歸一化處理的。
首先引入 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
。
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 類的使用。
數據變換不一定能提高模型的准確度,但是會提高數據的可解釋性。
需要注意的是,對訓練數據進行了數據變換之后,在測試模型准確度或者預測數據之前,也要對數據進行同樣的數據變換。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術干貨。