1. 程式人生 > >Scikit-learn 之 預處理模組

Scikit-learn 之 預處理模組

一、預處理的作用 在機器學習任務中,學習器都會對資料有一定的要求,比如在最近鄰演算法中,我需要尋找與中心點最近鄰的點,假設我們使用歐式距離度量,如果有一個屬性值是千萬量級,而另一個屬性是100以內,那麼如此計算的距離會嚴重依賴於大量級的屬性,這對最後模型結果是有很大的影響的。總之,預處理的目的就是為了能夠讓學習器得到“乾淨”的資料。在機器學習任務中,學習器都會對資料有一定的要求,比如在最近鄰演算法中,我需要尋找與中心點最近鄰的點,假設我們使用歐式距離度量,如果有一個屬性值是千萬量級,而另一個屬性是100以內,那麼如此計算的距離會嚴重依賴於大量級的屬性,這對最後模型結果是有很大的影響的。總之,預處理的目的就是為了能夠讓學習器得到“乾淨”的資料。 二、Sklearn有哪些預處理方案

2.1. 標準化 2.1.1. 作用 對於很多學習器,一般都比較喜歡符合正態分佈的資料,特別是標準正態分佈(零均值單位方差),所以對此我們獨立的對資料中的各個屬性通過StandardScaler進行處理,從而符合近似標準正態分佈。但並不是所有的資料這樣處理是合適的,針對有些資料其屬性值的標準差很小,或者對於一些稀疏資料,可能通過MinMaxScaler或者MaxAbsScaler處理更合適。在機器學習任務中,會經常出現稀疏資料,對於稀疏資料一般採用的是CSR(Compressed Sparse Rows)或者CSC(Compressed Sparse Columns)進行儲存,針對這類資料,採用MaxAbsScaler或者RobustScaler進行處理是非常合適的,因為它們並不會破環源資料的稀疏性,當然你也可以使用StandardScaler方法,但是必須傳入引數with_mean=False,從而保證處理後的資料的稀疏性,同時也不會不經意間增加過大的記憶體佔用。 2.1.2. Example及原理 [1]. StandardScaler <1>. Example 在這裡插入圖片描述
在這裡插入圖片描述 <2>. 原理 均值 在這裡插入圖片描述方差 在這裡插入圖片描述 標準化後的數值為: 在這裡插入圖片描述 PS:此時計算的方差其實是有偏的,當資料量較大時,影響不大,但是當資料量較小時,需要轉為無偏形式,也就是需要除以 (N-1)而非(N)。 [2].MinMaxScaler <1>. Example 在這裡插入圖片描述 在這裡插入圖片描述 <2>. 原理 在這裡插入圖片描述 [3].MaxAbsScaler <1>. Example 在這裡插入圖片描述 <2>. 原理 在這裡插入圖片描述 [4].RobustScaler <1>. Example 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 <2>. 原理 (1)首先對各個屬性中的數值進行升序排序 (2)如果with_centering引數為True,取各個屬性的中值,即center_ = median (3)如果with_scaling引數為True,根據引數quantile_range,計算各個屬性的四分位數,最後scale_ = Q3 - Q1,即第三四分位數減去第一分位數 (4)最後標準化的數值 在這裡插入圖片描述
PS:RobustScaler中的quantile_range引數(Q1, Q3)指定了第一及第三四分位數的位置,預設為(25, 75),其計算公式為: 在這裡插入圖片描述 如何得到的結果為整數,那麼該數對應的位置就是其相應四分位數(從1開始編號),如果不是整數,假設其在S和T位數值之間,那麼越靠近某個數,則該數的權重越大。例如2.75在排序後的序列中的第2和第3個位置之間,且離第個位置更近,其權重為0.75,則離第2個位置的權重為(1-0.75=0.25)。所以最終的四分位數為:S0.25+T0.75。如果是2.25,那麼離第2個位置更近,所以最終的四分位數為:S0.75+T0.25。 2.2. 非線性轉換 2.1.1. 作用 將各個屬性值轉換到某個範圍或者一個分佈上,因此適合對離散值的處理,但是因為是一個非線性轉換,所以也改變了屬性之間的距離及相關性特性。 2.1.2. Example [1]. QuantileTransformer 2.3. 正規化 2.1.1. 作用 正規化是作用在一個樣本上的,並非屬性上,這對於計算屬性之間的某些度量的情況下,是非常有作用的,比如計算樣本之間的距離時。在正規化方法中,應用最廣泛的時L1和L2正規化。因為Normalizer方法是獨立針對每個樣本進行處理的,所以其fit方法是沒有效果的。 2.1.2. Example及原理 [1]. Normalizer <1>. Example 在這裡插入圖片描述 在這裡插入圖片描述 <2>. 原理 當norm=’max’ 時,則對每條樣本取最大值,然後每條樣本與其最大值相除即可 當norm=’l1’ 時,則對每條樣本取其L1範數,然後每條樣本與其相除即可 當norm=’l2’ 時,則對每條樣本取其L2範數,然後每條樣本與其相除即可 2.4. 二值化 2.1.1. 作用 二值化對每條樣本中各個屬性進行處理,當值大於設定的一個閾值threshold是,即為1,否則為0,其fit方法也不起作用,直接使用transform即可進行二值化處理,其作用主要是滿足對下游的某些學習器的樣本先驗概率符合多變數Bernoulli Distribution的情況。 [1]. Binarizer 2.5. 編碼類別特徵 2.1.1. 作用 對於一些類別指標,本身是無序的,例如性別、國籍、城市等,如果我們直接從0開始依次編號,便不可避免的引入了有序的資訊,這對下游的某些學習器是不利的,而OneHotEncoder便可以對其無序編碼。 2.1.2. Example及原理 [1]. OneHotEncoder <1>. Example 在這裡插入圖片描述 在這裡插入圖片描述 <2>. 原理 從上面的Example可以看出: 當不帶引數n_values時,fit方法會得到各個屬性的類別,當最後transform中的屬性值在類別區間內,但是並不是某個類別,那麼其編碼後的值都為0,例如Example-2中的第二個屬性,2在類別0和3之間,但是並不是其中某一個類別;如果transform中的屬性值不在類別區間內,那麼就是報ValueError錯誤,例如Example-3。 當帶引數n_values時,那麼類別資訊將通過n_values中的值確定,例如Example-4中,即使fit中的第二個屬性有類別3,但是因為n_values的第二個屬性類別數量為3,即只有三個類別{0,1,2},所以當transform中的第二個屬性值為3時,將出現ValueError錯誤。 2.6. 缺失值處理 2.1.1. 作用 現實情境中,資料通常都會有缺失的情況,不管是對資料類似標準化、正則化或是餵給學習器,這都是不合理的,因此首先需要基於當前資料的資訊對缺失值進行補充,而Imputer便可以解決該類問題,當前有基於均值、中值及眾數來進行缺失值的補充。 PS: 在版本0.20之後,Imputer類將會廢棄,並在0.22版本將其刪除 2.1.2. Example [1]. Imputer 在這裡插入圖片描述 在這裡插入圖片描述 2.7. 生成多項式特徵 2.1.1. 作用 在一些場景中,我們需要構建更復雜的屬性,或者我們需要了解屬性之間的資訊,或者屬性數過少,為了更好構建模型,我們需要增加屬性數,那麼通過PolynomialFeatures便可以達到這個目的。 2.1.2. Example及原理 [1]. PolynomialFeatures <1>. Example 在這裡插入圖片描述 在這裡插入圖片描述 <2>. 原理 假設一個樣本含有兩個屬性[a, b],對於進行擴充,根據引數degree、interaction_only和include_bias進行控制 若include_bias為True,則會增加一列全為1的列 若interaction_only為True,則只會在屬性之間進行構建 引數degree控制著屬性構造數量,當degree=n,interaction_only=False,include_bias=True時,構造的屬性為: 在這裡插入圖片描述 2.8. 定製Transformer 2.1.1. 作用 在資料清洗或者預處理過程中,針對具體業務場景,我們可能需要定製化一個預處理方案,那麼就可以通過FunctionTransformer實現定製化 2.1.2. Example 在這裡插入圖片描述 在這裡插入圖片描述 三、重要概念 3.1. fit、transform和fit_transform fit方法得到的還是一個前處理器,只有再進行transform後才表示按照指定的前處理器對資料進行了真正的處理,其返回預處理後的結果,而fit_transform將fit和transform兩個操作都進行了,所以返回的是預處理後的結果。在機器學習任務中,我們一般會劃分訓練集和測試集,為了能夠保證不同資料集的分佈一致,其中需要注意的是我們需要對訓練集及測試集採用的預處理方法應該保證一致,所以我們一般會對訓練進行fit並儲存此時的前處理器,然後用同一個前處理器對訓練集及測試集進行transform。 PS:對於某些前處理器,fit方法並不起作用,例如Normalizer。

3.2. 稀疏資料的標準化 對於稀疏化資料,首先需要保證標準化後的資料仍然能保證其稀疏性,所以MaxAbsScaler可以應用在稀疏資料,對於StandardScaler,必須傳入with_mean = False從而保證標準化後的資料稀疏性。

3.3. 預處理一般流程 1.缺失值處理 2.異常值處理 3.標準化 4.正則化 5.資料稀疏問題 6.是否降維處理 7.屬性是否擴充

PS:本模組包含程式都在0.19.2版本的scikit-learn庫中進行測試 Sklearn預處理模組都在sklearn.preprocesssing包中