數據預處理的兩個階段:php
階段一,理解大綱和經常使用方法(本篇章內容)。html
階段二,過一遍最新版本的文檔。python
Ref: 4.4 基於TensorFlow理解三大降維技術:PCA、t-SNE 和自編碼器算法
Ref: 5.3. Preprocessing data【the latest version】shell
原文連接:https://blog.csdn.net/weixin_41990278/article/details/94860020app
4.3.1. 標準化、去均值、方差縮放(variance scaling)
dom
4.3.1.1. 特徵縮放至特定範圍ide
正態分佈:若是單個特徵沒有或多或少地接近於標準正態分佈,那麼它可能並不能在項目中表現出很好的性能。由於常見分佈的極限分佈是正態分佈。函數
中心化:減去均值。
縮放:除以很是量特徵(non-constant features)的標準差。
例如, 許多學習算法中目標函數的基礎都是假設:Ref: http://blog.csdn.net/dream_angel_z/article/details/49406573
Ref: 數據標準化/歸一化normalization
以下圖,x1的取值爲0-2000,而x2的取值爲1-5,假如只有這兩個特徵,對其進行優化時,會獲得一個窄長的橢圓形,致使在梯度降低時,梯度的方向爲垂直等高線的方向而走之字形路線,這樣會使迭代很慢,相比之下,右圖的迭代就會很快。
歸一化的另外一好處是提升精度,這在涉及到一些距離計算的算法時效果顯著,好比算法要計算歐氏距離,上圖中x2的取值範圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,因此這就會形成精度的損失。
因此歸一化頗有必要,他能夠使各個特徵對結果作出的貢獻相同。
在多指標評價體系中,因爲各評價指標的性質不一樣,一般具備不一樣的量綱和數量級。當各指標間的水平相差很大時,若是直接用原始指標值進行分析,就會突出數值較高的指標在綜合分析中的做用,相對削弱數值水平較低指標的做用。
所以,爲了保證結果的可靠性,須要對原始指標數據進行標準化處理。
在數據分析以前,咱們一般須要先將數據標準化(normalization),利用標準化後的數據進行數據分析。數據標準化也就是統計數據的指數化。數據標準化處理主要包括數據同趨化處理和無量綱化處理兩個方面。
通過上述標準化處理,原始數據均轉換爲無量綱化指標測評值,即各指標值都處於同一個數量級別上,能夠進行綜合測評分析。
In a nutshell
從經驗上說,歸一化是讓不一樣維度之間的特徵在數值上有必定比較性,能夠大大提升分類器的準確性。
from sklearn import preprocessing
import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) X_scaled =preprocessing.scale(X)
X_scaled array([[ 0. , -1.22474487, 1.33630621], [ 1.22474487, 0. , -0.26726124], [-1.22474487, 1.22474487, -1.06904497]])
X_scaled.mean(axis=0) X_scaled.std(axis=0)
可見,這裏將矩陣的縱列標準化,而不是對整個矩陣。
通過StandardScaler以後,橫座標與縱座標的分佈出現了很大的差別,這多是outliers形成的。
去除outliers是一個後續探討的問題。
(1) 映射到 [0,1] - MinMaxScaler
X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) min_max_scaler =preprocessing.MinMaxScaler() X_train_minmax = min_max_scaler.fit_transform(X_train)
X_train_minmax #array([[ 0.5 , 0. , 1. ], # [ 1. , 0.5 , 0.33333333], # [ 0. , 1. , 0. ]])
min_max_scaler.scale_ min_max_scaler.min_
# 訓練部分數據,獲得變換method,再用到test數據中,這樣更高效些 X_test = np.array([[ -3., -1., 4.]]) X_test_minmax = min_max_scaler.transform(X_test) X_test_minmax
例如:假定屬性income的最小與最大值分別爲$12,000和$98,000。咱們想映射income到區間[0,1]。
根據min-max標準化,income值$73,600將變換爲(73,600-12,000)/(98,000-12,000)×(1-0)=0.716。
(2) 映射到 [-1,1] - MaxAbsScaler
X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler() X_train_maxabs = max_abs_scaler.fit_transform(X_train) X_train_maxabs # doctest +NORMALIZE_WHITESPACE^ #array([[ 0.5, -1. , 1. ], # [ 1. , 0. , 0. ], # [ 0. , 1. , -0.5]])
# 訓練部分數據,獲得變換method,再用到test數據中,這樣效率高些
X_test = np.array([[ -3., -1., 4.]]) X_test_maxabs = max_abs_scaler.transform(X_test) X_test_maxabs max_abs_scaler.scale_
(3) [0, 1] 仍是 [-1, 1] ?
假設咱們有一個只有一個hidden layer的多層感知機(MLP)的分類問題。每一個hidden unit表示一個超平面,每一個超平面是一個分類邊界。參數w(weight)決定超平面的方向,參數b(bias)決定超平面離原點的距離。若是b是一些小的隨機參數(事實上,b確實被初始化爲很小的隨機參數),那麼全部的超平面都幾乎穿過原點。因此,若是data沒有中心化在原點周圍,那麼這個超平面可能沒有穿過這些data,也就是說,這些data都在超平面的一側。這樣的話,局部極小點(local minima)頗有可能出現。 因此,在這種狀況下,標準化到[-1, 1]比[0, 1]更好。
一、在分類、聚類算法中,須要使用距離來度量類似性的時候、或者使用PCA技術進行降維的時候,StandardScaler表現更好。
二、在不涉及距離度量、協方差計算、數據不符合正太分佈的時候,可使用MinMaxScaler。好比圖像處理中,將RGB圖像轉換爲灰度圖像後將其值限定在[0 255]的範圍。
緣由是使用MinMaxScaler,其協方差產生了倍數值的縮放,所以這種方式沒法消除量綱對方差、協方差的影響,對PCA分析影響巨大;同時,因爲量綱的存在,使用不一樣的量綱、距離的計算結果會不一樣。
而在StandardScaler中,新的數據因爲對方差進行了歸一化,這時候每一個維度的量綱其實已經等價了,每一個維度都服從均值爲0、方差1的正態分佈,在計算距離的時候,每一個維度都是去量綱化的,避免了不一樣量綱的選取對距離計算產生的巨大影響。
數據處理的時候除了數據清洗,離羣值處理等,每每還須要一些數據變換的方法。
(如下內容涉及到的一些概念,在後續章節學習)
去量綱指的的去除數據單位之間的不統一,將數據統一變換爲無單位(統一單位)的數據集,也能夠做爲指標的權重,進行後續的加權計算,這點在平常有諸多應用。
在肯定指標權重時,應先對數據進行清洗,權重的肯定過程應該更靠近建模或者結果輸出部分,肯定指標權重時,須要考慮指標是否有負值、所採起方法分母是否爲0、正負向指標劃分等狀況。
指標權重的肯定有主觀、客觀和混合三類。
經驗權重法爲主觀方法。主成分/因子分析、信息量(變異係數)、獨立性(多元迴歸分析)、相關係數法爲客觀權重法。
RSR(秩和比)和層次分析法(AHP)、Delphi、專家排序、算數均值組合(均數法)、連乘累積組合(累積法)採起主客觀混合使用。本文主要討論客觀權重法。
經驗權重法由轉接或主負責人根據評價指標的重要性來肯定權重。
主成分/因子分析,利用方差最大正交旋轉法,獲得特徵根大於等於1的共性因子,計算共性因子的累計貢獻率肯定權重,累積貢獻率越大,權重越大。
獨立性權重法,採用多元迴歸分析方法,計算複相關係數肯定權重,以每項指標爲因變量,以其餘指標爲自變量,計算複相關係數,獲得各指標對應的複相關係數,複相關係數越大,重複信息越多,權重應該越小,故可取倒數做爲權重得分。
權重穩定性檢驗(暫時不考慮),權重是通過統計獲得的頻數分佈中的頻率,在抽樣統計中,每一權重變更在 5-10個百分點之間,綜合評價z值與原z值排序結果一致,說明權重在該系統是穩定的。
如下是一些經常使用方法,各類方法的適用環境還須要多多嘗試和摸索,我在這裏也會根據本身的工做狀況,更新各類方法的使用心得。
線性比例變換:正逆向指標都變爲正向;全部指標都是非負數,逆向指標處理爲非線性變換。
向量歸一化(列模爲1):考慮了指標差別性;正逆指標方向無變化,不能消除負值。
極差變換法:正逆指標方向一致,全變爲正值;忽略了指標差別性。
Z值法/標準樣本變換法:樣本標準正態化;負值,正逆指標方向無變化
辨析:
標準化 (歸一化),正則化,規範化
規範化是使單個樣本具備單位範數的縮放操做,計算 "樣本對的類似性"。
這個在你使用二次型,好比點積或者其餘核去定量計算任意樣本對之間的類似性時是很是有用的。
規範化是向量空間模型 <http://en.wikipedia.org/wiki/Vector_Space_Model> 的基本假設,常常在文本分類和聚類當中使用。
思想:
normalize 主要思想是對每一個樣本計算其p-範數,
而後對該樣本中每一個元素除以該範數,
這樣處理的結果是使得每一個處理後樣本的p-範數 (L1-norm, L2-norm) 等於1。
X = [[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]] X_normalized = preprocessing.normalize(X, norm='l1') X_normalized array([[ 0.25, -0.25, 0.5 ], [ 1. , 0. , 0. ], [ 0. , 0.5 , -0.5 ]]) X_normalized = preprocessing.normalize(X, norm='l2') X_normalized array([[ 0.40824829, -0.40824829, 0.81649658], [ 1. , 0. , 0. ], [ 0. , 0.70710678, -0.70710678]])
或者,先建立個對象,讓這個對象去處理數據。
normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)
normalizer.transform([[-1., 1., 0.]])
數據量多,趨向於正態分佈;那數據量少(稀疏)時,怎麼辦?
稀疏數據的中心化會破壞數據中的稀疏結構,所以不多有一個比較明智的實現方式。
MaxAbsScaler【推薦】
可是,對稀疏輸入進行縮放操做是有意義的,特別是當特徵的數值並不在同一個量級上面的時候。 MaxAbsScaler
和:func:maxabs_scale 是稀疏數據縮放比較推薦的實現方式。
中心化破壞稀疏性【當心】
可是,scale
和 StandardScaler
能夠接收``scipy.sparse``矩陣做爲輸入,只要將參數``with_centering=False``傳入構造函數。
不然程序將會出現異常 ValueError
。 由於默認的中心化操做會破壞數據的稀疏性,並致使大量的內存佔用。
異常值 與 稀疏性【不適用】
RobustScaler
並不適用於稀疏數據,可是你能夠在稀疏輸入上使用the ``transform``方法。
注意,縮放器既能夠接收行壓縮稀疏數據也能夠是列壓縮稀疏數據(參見``scipy.sparse.csr_matrix``和``scipy.sparse.csc_matrix``)。 其餘形式的稀疏輸入**會被轉換爲行壓縮稀疏表示**。爲了不沒必要要的內存複製,推薦在頂層使用CSR或CSC表示。
最後,若是已經中心化的數據並非很大,能夠選擇使用’‘toarray’‘方法將稀疏矩陣轉換爲數組。
若是你的數據包含較多的異常值,使用均值和方差縮放可能並非一個很好的選擇。
在這種狀況下,你可使用robust_scale
和:class:RobustScaler 做爲替代。它們使用更加魯棒的中心和範圍估計來縮放你的數據。
4.3.5. 缺失值處理(Imputation)
處理缺失數值的一個更好的策略就是從已有的數據推斷出缺失的數值。
缺失數值處理的基本策略,好比使用缺失數值所在行或列的均值、中位數、衆數來替代缺失值。該類也兼容不一樣的缺失值編碼。
# 缺失值被編碼爲``np.nan``, 使用包含缺失值的列的均值來替換缺失值。
import numpy as np from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0) imp.fit([[1, 2], [np.nan, 3], [7, 6]]) Y = [[np.nan, 2], [6, np.nan], [7, 6]] print(imp.transform(Y))
上述代碼使用數組X去「訓練」一個Imputer類,而後用該類的對象去處理數組Y中的缺失值,缺失值的處理方式是使用X中的均值(axis=0表示按列進行)代替Y中的缺失值。
固然也可使用imp對象來對X數組自己進行處理。
4.3.6. 多項式特徵生成
不少狀況下,考慮輸入數據中的非線性特徵來增長模型的複雜性是很是有效的。
一個簡單經常使用的方法就是使用多項式特徵,它能捕捉到特徵中高階和相互做用的項。
特徵向量X從:math:(X_1, X_2) 被轉換成:math:(1, X_1, X_2, X_12, X_1*X_2, X_22)。
特徵升維效果:
import numpy as np from sklearn.preprocessing import PolynomialFeatures X = np.arange(6).reshape(3, 2) #array([[0, 1], # [2, 3], # [4, 5]])
poly = PolynomialFeatures(2) poly.fit_transform(X) #array([[ 1., 0., 1., 0., 0., 1.], # [ 1., 2., 3., 4., 6., 9.], # [ 1., 4., 5., 16., 20., 25.]])
將特徵多樣化後(一個典型的例子),有助於加快training:
僅保留交叉項:
X = np.arange(9).reshape(3, 3) poly = PolynomialFeatures(degree=3, interaction_only=True) poly.fit_transform(X)
經過嘗試不一樣的degree的曲線模型來擬合樣本點:
#!/usr/bin/env python
""" ======================== Polynomial interpolation ======================== This example demonstrates how to approximate a function with a polynomial of degree n_degree by using ridge regression. Concretely, from n_samples 1d points, it suffices to build the Vandermonde matrix, which is n_samples x n_degree+1 and has the following form: [[1, x_1, x_1 ** 2, x_1 ** 3, ...], [1, x_2, x_2 ** 2, x_2 ** 3, ...], ...] Intuitively, this matrix can be interpreted as a matrix of pseudo features (the points raised to some power). The matrix is akin to (but different from) the matrix induced by a polynomial kernel. This example shows that you can do non-linear regression with a linear model, using a pipeline to add non-linear features. Kernel methods extend this idea and can induce very high (even infinite) dimensional feature spaces. """
print(__doc__) # Author: Mathieu Blondel # Jake Vanderplas # License: BSD 3 clause
import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Ridge from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline def f(x): """ function to approximate by polynomial interpolation"""
return x * np.sin(x) # generate points used to plot
x_plot = np.linspace(0, 10, 100) # generate points and keep a subset of them
x = np.linspace(0, 10, 100) rng = np.random.RandomState(0) rng.shuffle(x) x = np.sort(x[:20]) y = f(x) # 得到這次實驗樣本
# create matrix versions of these arrays
X = x[:, np.newaxis] X_plot = x_plot[:, np.newaxis] plt.plot(x_plot, f(x_plot), label="ground truth") plt.scatter(x, y, label="training points") for degree in [3, 4, 5]: model = make_pipeline( PolynomialFeatures(degree), Ridge() ) # pipeline的使用另起一章 model.fit(X, y) y_plot = model.predict(X_plot) plt.plot(x_plot, y_plot, label="degree %d" % degree) plt.legend(loc='lower left') plt.show()
Result:
白化是例如pca,ica操做以前的必要數據預處理步驟。
From: http://blog.csdn.net/lizhe_dashuju/article/details/50263339
FastICA須要對數據作白化處理。
設x是一個隨機變量,存在一個線性變換V將它變換成z:
且:
那麼,V就是白化變換矩陣。
Ref: http://ufldl.stanford.edu/wiki/index.php/%E7%99%BD%E5%8C%96
咱們已經瞭解瞭如何使用PCA下降數據維度。在一些算法中還須要一個與之相關的預處理步驟,這個預處理過程稱爲白化(一些文獻中也叫sphering)。
舉例來講,假設訓練數據是圖像,因爲圖像中相鄰像素之間具備很強的相關性,因此用於訓練時輸入是冗餘的。
白化的目的就是下降輸入的冗餘性;更正式的說,咱們但願經過白化過程使得學習算法的輸入具備以下性質:
(i) 特徵之間相關性較低;
(ii) 全部特徵具備相同的方差。
詳見:UFLDL Tutorial,Preprocessing: PCA and Whitening
End.