python 機(jī)器學(xué)習(xí)的標(biāo)準(zhǔn)化、歸一化、正則化、離散化和白化
機(jī)器學(xué)習(xí)的本質(zhì)是從數(shù)據(jù)集中發(fā)現(xiàn)數(shù)據(jù)內(nèi)在的特征,而數(shù)據(jù)的內(nèi)在特征往往被樣本的規(guī)格、分布范圍等外在特征所掩蓋。數(shù)據(jù)預(yù)處理正是為了最大限度地幫助機(jī)器學(xué)習(xí)模型或算法找到數(shù)據(jù)內(nèi)在特征所做的一系列操作,這些操作主要包括標(biāo)準(zhǔn)化、歸一化、正則化、離散化和白化等。
1 標(biāo)準(zhǔn)化
假定樣本集是二維平面上的若干個(gè)點(diǎn),橫坐標(biāo) x 分布于區(qū)間 [0,100] 內(nèi),縱坐標(biāo) y 分布于區(qū)間 [0,1] 內(nèi)。顯然,樣本集的 x 特征列和 y 特征列的動(dòng)態(tài)范圍相差巨大,對(duì)于機(jī)器學(xué)習(xí)模型(如k-近鄰或 k-means 聚類)的影響也會(huì)有顯著差別。標(biāo)準(zhǔn)化處理正是為了避免某一個(gè)動(dòng)態(tài)范圍過大的特征列對(duì)計(jì)算結(jié)果造成影響,同時(shí)還可以提升模型精度。標(biāo)準(zhǔn)化的實(shí)質(zhì)是對(duì)樣本集的每個(gè)特征列減去該特征列均值進(jìn)行中心化,再除以標(biāo)準(zhǔn)差進(jìn)行縮放。
Scikit-learn的預(yù)處理子模塊preprocessing提供了一個(gè)快速標(biāo)準(zhǔn)化函數(shù)scale(),使用該函數(shù)可以直接返回標(biāo)準(zhǔn)化后的數(shù)據(jù)集,其代碼如下。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> d = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> d_scaled = pp.scale(d) # 對(duì)數(shù)據(jù)集d做標(biāo)準(zhǔn)化 >>> d_scaled array([[ 0. , -1.22474487, 1.40487872], [ 1.22474487, 0. , -0.84292723], [-1.22474487, 1.22474487, -0.56195149]]) >>> d_scaled.mean(axis=0) # 標(biāo)準(zhǔn)化以后的數(shù)據(jù)集,各特征列的均值為0 array([0., 0., 0.]) >>> d_scaled.std(axis=0) # 標(biāo)準(zhǔn)化以后的數(shù)據(jù)集,各特征列的標(biāo)準(zhǔn)差為1 array([1., 1., 1.])
預(yù)處理子模塊 preprocessing 還提供了一個(gè)實(shí)用類 StandardScaler,它保存了訓(xùn)練集上各特征列的平均值和標(biāo)準(zhǔn)差,以便以后在測(cè)試集上應(yīng)用相同的變換。此外,實(shí)用類StandardScaler 還可以通過 with_mean 和 with_std 參數(shù)指定是否中心化和是否按標(biāo)準(zhǔn)差縮放,其代碼如下。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> scaler = pp.StandardScaler().fit(X_train) >>> scaler StandardScaler(copy=True, with_mean=True, with_std=True) >>> scaler.mean_ # 訓(xùn)練集各特征列的均值 array([ 1., -3., 3.]) >>> scaler.scale_ # 訓(xùn)練集各特征列的標(biāo)準(zhǔn)差 array([0.81649658, 1.63299316, 3.55902608]) >>> scaler.transform(X_train) # 標(biāo)準(zhǔn)化訓(xùn)練集 array([[ 0. , -1.22474487, 1.40487872], [ 1.22474487, 0. , -0.84292723], [-1.22474487, 1.22474487, -0.56195149]]) >>> X_test = [[-1., 1., 0.]] # 使用訓(xùn)練集的縮放標(biāo)準(zhǔn)來標(biāo)準(zhǔn)化測(cè)試集 >>> scaler.transform(X_test) array([[-2.44948974, 2.44948974, -0.84292723]])
2 歸一化
標(biāo)準(zhǔn)化是用特征列的均值進(jìn)行中心化,用標(biāo)準(zhǔn)差進(jìn)行縮放。如果用數(shù)據(jù)集各個(gè)特征列的最小值進(jìn)行中心化后,再按極差(最大值-最小值)進(jìn)行縮放,即數(shù)據(jù)減去特征列的最小值,并且會(huì)被收斂到區(qū)間 [0,1] 內(nèi),這個(gè)過程就叫作數(shù)據(jù)歸一化。
Scikit-learn的預(yù)處理子模塊 preprocessing 提供 MinMaxScaler 類來實(shí)現(xiàn)歸一化功能。MinMaxScaler 類有一個(gè)重要參數(shù) feature_range,該參數(shù)用于設(shè)置數(shù)據(jù)壓縮的范圍,默認(rèn)是 [0,1]。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> scaler = pp.MinMaxScaler().fit(X_train) # 默認(rèn)數(shù)據(jù)壓縮范圍為[0,1] >>> scaler MinMaxScaler(copy=True, feature_range=(0, 1)) >>> scaler.transform(X_train) array([[0.5 , 0. , 1. ], [1. , 0.5 , 0. ], [0. , 1. , 0.125]]) >>> scaler = pp.MinMaxScaler(feature_range=(-2, 2)) # 設(shè)置數(shù)據(jù)壓縮范圍為[-2,2] >>> scaler = scaler.fit(X_train) >>> scaler.transform(X_train) array([[ 0. , -2. , 2. ], [ 2. , 0. , -2. ], [-2. , 2. , -1.5]])
因?yàn)闅w一化對(duì)異常值非常敏感,所以大多數(shù)機(jī)器學(xué)習(xí)算法會(huì)選擇標(biāo)準(zhǔn)化來進(jìn)行特征縮放。在主成分分析(Principal Components Analysis,PCA)、聚類、邏輯回歸、支持向量機(jī)、神經(jīng)網(wǎng)絡(luò)等算法中,標(biāo)準(zhǔn)化往往是最好的選擇。歸一化在不涉及距離度量、梯度、協(xié)方差計(jì)算,以及數(shù)據(jù)需要被壓縮到特定區(qū)間時(shí)被廣泛使用,如數(shù)字圖像處理中量化像素強(qiáng)度時(shí),都會(huì)使用歸一化將數(shù)據(jù)壓縮在區(qū)間 [0,1] 內(nèi)。
3 正則化
歸一化是對(duì)數(shù)據(jù)集的特征列的操作,而正則化是將每個(gè)數(shù)據(jù)樣本的范數(shù)單位化,是對(duì)數(shù)據(jù)集的行操作。如果打算使用點(diǎn)積等運(yùn)算來量化樣本之間的相似度,那么正則化將非常有用。
Scikit-learn的預(yù)處理子模塊preprocessing提供了一個(gè)快速正則化函數(shù)normalize(),使用該函數(shù)可以直接返回正則化后的數(shù)據(jù)集。normalize()函數(shù)使用參數(shù)norm指定I1范式或I2范式,默認(rèn)使用I2范式。I1 范式可以理解為單個(gè)樣本各元素的絕對(duì)值之和為 1;I2 范式可理解為單個(gè)樣本各元素的平方和的算術(shù)根為 1,相當(dāng)于樣本向量的模(長度)。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> pp.normalize(X_train) # 使用I2范式正則化,每行的范數(shù)為1 array([[ 0.10540926, -0.52704628, 0.84327404], [ 0.5547002 , -0.83205029, 0. ], [ 0. , -0.70710678, 0.70710678]]) >>> pp.normalize(X_train, norm='I1') # 使用I1范式正則化,每行的范數(shù)為1 array([[ 0.07142857, -0.35714286, 0.57142857], [ 0.4 , -0.6 , 0. ], [ 0. , -0.5 , 0.5 ]])
4 離散化
離散化(Discretization)是將連續(xù)特征劃分為離散特征值,典型的應(yīng)用是灰度圖像的二值化。如果使用等寬的區(qū)間對(duì)連續(xù)特征離散化,則被稱為 K-bins 離散化。Scikit-learn的預(yù)處理子模塊preprocessing提供了Binarizer類和KbinsDiscretizer類來進(jìn)行離散化,前者用于二值化,后者用于 K-bins 離散化。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X = np.array([[-2,5,11],[7,-1,9],[4,3,7]]) >>> bina = pp.Binarizer(threshold=5) # 指定二值化閾值為5 >>> bina.transform(X) array([[0, 0, 1], [1, 0, 1], [0, 0, 1]]) >>> est = pp.KBinsDiscretizer(n_bins=[2, 2, 3], encode='ordinal').fit(X) >>> est.transform(X) # 三個(gè)特征列離散化為2段、2段、3段 array([[0., 1., 2.], [1., 0., 1.], [1., 1., 0.]])
5 白化
白化一詞是從whitening翻譯過來的,難以望文生義,只能從白化后的效果去理解。數(shù)據(jù)白化有兩個(gè)目的,一是去除或降低特征列之間的相關(guān)性,二是使得每個(gè)特征列的方差為1。顯然,白化的第一個(gè)目標(biāo)就是主成分分析(PCA),通過主成分分析降維,消除方差占比較小的特征維;白化的第二個(gè)目標(biāo)就是標(biāo)準(zhǔn)化。
白化分為PCA白化和ZCA白化兩種。PCA 白化將原數(shù)據(jù)各個(gè)特征維變換到主成分軸上,消除了特征之間的相關(guān)性,并使得各個(gè)主成分的方差為1。ZCA白化則是將PCA 白化的結(jié)果反變換到原數(shù)據(jù)的各個(gè)特征維軸上,因?yàn)閆CA白化過程中通常不會(huì)降維。
Scikit-learn沒有提供專用的白化方法,不過借助成分分析子模塊decomposition提供的PCA 類可以輕松實(shí)現(xiàn)PCA白化。PCA類的參數(shù)whiten用于設(shè)置是否移除特征間的線性關(guān)聯(lián),默認(rèn)值為False。
假如一位姑娘手頭有一堆相親資料,每位帥哥的信息由年齡、身高、體重、年薪、房產(chǎn)數(shù)量、汽車數(shù)量等多個(gè)特征項(xiàng)組成。通過白化操作,能夠生成一個(gè)特征維較小、且可以直接比較樣本間差距的數(shù)據(jù)集。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> from sklearn.decomposition import PCA >>> ds = np.array([ [25, 1.85, 70, 50, 2, 1], [22, 1.78, 72, 22, 0, 1], [26, 1.80, 85, 25, 1, 0], [28, 1.70, 82, 100, 5, 2] ]) # 4個(gè)樣本,6個(gè)特征列 >>> m = PCA(whiten=True) # 實(shí)例化主成分分析類,指定白化參數(shù) >>> m.fit(ds) # 主成分分析 PCA(whiten=True) >>> d = m.transform(ds) # 返回主成分分析結(jié)果 >>> d # 特征列從6個(gè)降至4個(gè) array([[ 0.01001541, -0.99099492, -1.12597902, -0.03748764], [-0.76359767, -0.5681715 , 1.15935316, 0.67477757], [-0.65589352, 1.26928222, -0.45686577, -1.8639689 ], [ 1.40947578, 0.28988421, 0.42349164, 1.2724972 ]]) >>> d.std(axis=0) # 顯示各特征列方差 array([0.8660254 , 0.8660254 , 0.8660254 , 1.17790433]) >>> d = pp.scale(d) # 標(biāo)準(zhǔn)化 >>> d.std(axis=0) # 標(biāo)準(zhǔn)化后的各特征列方差均為1 array([1., 1., 1., 1.])
GitHub上有人提供了ZCA白化的代碼,如果需要,請(qǐng)?jiān)L問(https://github.com/mwv/zca)。
以上就是聊聊python 機(jī)器學(xué)習(xí)的標(biāo)準(zhǔn)化、歸一化、正則化、離散化和白化的詳細(xì)內(nèi)容,更多關(guān)于python 機(jī)器學(xué)習(xí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用七牛Python SDK寫一個(gè)同步腳本及使用教程
七牛云存儲(chǔ)的 Python 語言版本 SDK(本文以下稱 Python-SDK)是對(duì)七牛云存儲(chǔ)API協(xié)議的一層封裝,以提供一套對(duì)于 Python 開發(fā)者而言簡(jiǎn)單易用的開發(fā)工具本篇文章給大家介紹如何使用七牛Python SDK寫一個(gè)同步腳本及使用及使用教程,需要的朋友可以參考下2015-08-08使用Python對(duì)EXCEL數(shù)據(jù)的預(yù)處理
這篇文章主要介紹了使用Python處理EXCEL基礎(chǔ)操作篇2,如何使用Python對(duì)EXCEL數(shù)據(jù)的預(yù)處理,文中提供了解決思路和部分實(shí)現(xiàn)代碼,一起來看看吧2023-03-03利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測(cè)圖片
今天小編就為大家分享一篇利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測(cè)圖片,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python 解決中文寫入Excel時(shí)拋異常的問題
下面小編就為大家分享一篇Python 解決中文寫入Excel時(shí)拋異常的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python和RabbitMQ進(jìn)行消息傳遞和處理方式
這篇文章主要介紹了Python和RabbitMQ進(jìn)行消息傳遞和處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07