一般在機器學習的模型訓練之前,有乙個比較重要的步驟是資料變換。
因為,一般情況下,原始資料的各個特徵的值並不在乙個統一的範圍內,這樣資料之間就沒有可比性。
資料變換的目的是將不同渠道,不同量級的資料轉化到統一的範圍之內,方便後續的分析處理。
資料變換的方法有很多,比如資料平滑,資料聚集,資料概化,資料規範化和屬性構造等。
本篇文章主要介紹資料規範化,這是一種比較常用,也比較簡單的方法。
資料規範化是使屬性資料按比例縮放,這樣就將原來的數值對映到乙個新的特定區域中,包括歸一化,標準化等。
1,資料歸一化
歸一化就是獲取原始資料的最大值和最小值,然後把原始值線性變換到 [0,1] 範圍之內,變換公式為:
其中:x 是當前要變換的原始值。
min 是當前特徵中的最小值。
max 是當前特徵中的最大值。
x' 是變換完之後的新值。
注意:min 和 max 是指當前特徵中的最小最大值。
所以同一特徵之內,最小最大值是一樣的。
而不同特徵之間,最小最大值是不一樣的。
從公式中可以看出,歸一化與最大最小值有關,這也是歸一化的缺點,因為最大值與最小值非常容易受噪音資料的影響。
1.1,歸一化處理
比如,我們有以下資料:
編號特徵1
特徵2特徵3
第1條第2條
第3條通過資料可以觀察出:
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 之間的值。
優點:是簡單易行,好理解。
缺點:是容易受最大最小值的干擾。
標準化:介紹了 z-score 標準化,原始資料經過轉換後,符合標準正態分佈。
和歸一化相比,z-score 標準化不容易受到噪音資料的影響。
資料變換不一定能提高模型的準確度,但是會提高資料的可解釋性。
需要注意的是,對訓練資料進行了資料變換之後,在測試模型準確度或者**資料之前,也要對資料進行同樣的資料變換。
(本節完。)
推薦閱讀:
r語言歸一化 R語言 資料規範化 歸一化
筆者寄語 規範化主要是因為資料受著單位的影響較大,需要進行量綱化。大致有 最小 最大規範化 均值標準化 小數定標規範化 1 最小 最大規範化 也叫離差標準化,是對原始資料的線性變換,將資料對映到 0,1 之間,與功效係數法相同。最小 最大規範化 b1 data 1 min data 1 max da...
資料歸一化
近來,在網上搜了很多關於資料歸一化的帖子,看了太多,很雜,這裡整理總結一下 歸一化是一種資料預處理方法,就是要把你需要處理的資料經過處理後 通過某種演算法 限制在你需要的一定範圍內,為了後面資料處理的方便,其次是保正程式執行時 收斂加快。比如說,對於奇異樣本資料 所謂奇異樣本資料資料指的是相對於其他...
資料歸一化
如果對神經網路的 輸入和 輸出數 據進行 一定的 預處理 可以加快網路的訓練速 度 matlab 中 提供的預 處理方 法有歸一化處理 將每組資料都變為 1 至 1 之 間數 所涉及 的函式有 premnmx postmnmx tramnmx 標準化處理 將每組資料都為均 值為 0,方 差 為 1 ...