數據預處理(sklearn.preprocessing)

前言

數據預處理的工具有許多,在我看來主要有兩種:pandas數據預處理和scikit-learn中的sklearn.preprocessing數據預處理。

前面更新的博客中,我已有具體的根據pandas來對數據進行預處理,原文請點擊這裏。其中主要知識點包括一下幾個方面:

  1. 數據的集成:merge、concat、join、combine_first;
  2. 數據類型轉換:字符串處理(正則表達式)、數據類型轉換(astype)、時間序列處理(to_datetime)等;
  3. 缺失值處理:查找、定位、刪除、填充等;
  4. 重複值處理:查找、定位、刪除等;
  5. 異常值處理:根據原理自定義函數處理異常數據(不推薦);
  6. 特徵修改:增加、刪除、變換(簡單函數變換)、離散化等;
  7. 數據抽樣:簡單隨機抽樣、分層抽樣等;
  8. …………

這裏,本文主要針對與在scikit-learn中的sklearn.preprocessing數據預處理。

首先,sklearn.preprocessing包提供了幾個常用的實用函數轉換器類(這裏主要介紹類的使用),以將原始特徵向量轉換爲更適合下游估計器的表示。

preprocessing中有很多的類,但主要有以下幾種常用的數據處理類:

1. 標準化

標準化相信大家接觸的也多所以這裏就不過多介紹,這裏只是順帶提一下。

  1. StandardScaler
  2. MinMaxScaler
  3. MaxAbsScaler
  4. RobustScaler

1. StandardScaler

Standardization標準化:將特徵數據的分佈調整成標準正太分佈,也叫高斯分佈,也就是使得數據的均值維0,方差爲1.

2. MinMaxScaler

最小-最大規範化對原始數據進行線性變換,變換到[0,1]區間(也可以是其他固定最小最大值的區間)每個特徵中的最小值變成了0,最大值變成了1.

3. MaxAbsScaler

原理與上面的很像,只是數據會被規模化到[-1,1]之間。也就是特徵中,所有數據都會除以最大值。這個方法對那些已經中心化均值維0或者稀疏的數據有意義,後者不會改變矩陣的稀疏性,是0的還是0,而前者會改變。

4. RobustScaler

根據四分位數來縮放數據。對於數據有較多異常值的情況,使用均值和方差來標準化顯然不合適,按中位數,一、四分位數縮放效果要好。

2. 非線性變換

  1. QuantileTransformer
  2. PowerTransformer

1. QuantileTransformer

QuantileTransformer 類將每個特徵縮放在同樣的範圍或分佈情況下。但是,通過執行一個秩轉換能夠使異常的分佈平滑化,並且能夠比縮放更少地受到離羣值的影響。但是它的確使特徵間及特徵內的關聯和距離失真了。以下是QuantileTransformer參數:

sklearn.preprocessing.QuantileTransformer(n_quantiles=1000, output_distribution=’uniform’,
 ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)

該方法將特徵變換爲均勻分佈或正態分佈(通過設置output_distribution=‘normal’)。因此,對於給定的特性,這種轉換傾向於分散最頻繁的值。它還減少了(邊緣)異常值的影響:因此,這是一個健壯的預處理方案。

2. PowerTransformer

映射到高斯分佈。在許多建模場景中,數據集中的特性是正常的。冪變換是一類參數的單調變換,其目的是將數據從任意分佈映射到儘可能接近高斯分佈,以穩定方差和最小化偏度。

PowerTransformer目前提供了兩個這樣的冪變換,Yeo-Johnson變換和Box-Cox變換,利用極大似然估計了穩定方差和最小偏度的最優參數。並且,box-Cox要求輸入數據嚴格爲正數據,而Yeo-Johnson支持正負數據。參數如下:

sklearn.preprocessing.PowerTransformer(method=’yeo-johnson’, standardize=True, copy=True)

注意:PowerTransformer只有在0.20.0纔有,不然會報錯。 你可以使用conda update scikit-learn來進行更新。

3. 正則化( Normalizer)

歸一化是縮放單個樣本以具有單位範數的過程,這裏的”範數”,可以使用L1或L2範數。如果你計劃使用二次形式(如點積或任何其他核函數)來量化任何樣本間的相似度,則此過程將非常有用。

這個觀點基於 向量空間模型(Vector Space Model) ,經常在文本分類和內容聚類中使用。

sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)

其中,norm : ‘l1’, ‘l2’, or ‘max’, optional (‘l2’ by default)

4. 編碼分類特徵

  1. OrdinalEncoder
  2. OneHotEncoder

1. OrdinalEncoder

這個類好幸也是0.20.0纔出來的也要更新scikit-learn,資料相對較少,根據原文的翻譯大概有以下幾個意思:

這個轉換器的輸入應該是一個類似數組的整數或字符串,表示由分類(離散)特性獲得的值。特徵被轉換爲序數整數。這將導致每一個特徵都有一列整數(0到n-類別-1)。

sklearn.preprocessing.OrdinalEncoder(categories=’auto’, dtype=<class ‘numpy.float64’>)

然而,這種整數表示不能直接與所有Scikit-Learning估值器一起使用,因爲這些估計器需要連續的輸入,並且將類別解釋爲被排序,這通常是不需要的(即瀏覽器的集合是任意排序的)。

2. OneHotEncoder

另一種將分類特徵轉換爲能夠被scikit-learn中模型使用的編碼是one-of-K或one-hot編碼,在 OneHotEncoder 中實現,也稱爲一個熱編碼或虛擬編碼。這個類使用 n 個可能值轉換爲 n值化特徵,將分類特徵的每個元素轉化爲一個值,它可以將有n種值的一個特徵變成n個二元的特徵,選擇該選項則對應特徵值爲1否則爲0。

sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, 
categories=None, sparse=True, dtype=<class ‘numpy.float64’>, handle_unknown=’error’)

默認情況下,每個特徵使用幾維的數值由數據集自動推斷。當然,你也可以通過使用參數n_values來精確指定

5. 離散化

離散化(也稱爲量化或綁定)提供了一種將連續特徵劃分爲離散值的方法。某些具有連續特徵的數據集可能受益於離散化,因爲離散化可以將連續屬性的數據集轉換爲僅具有名義屬性的數據集。

  1. KBinsDiscretizer
  2. Binarizer

1. KBinsDiscretizer

k個等寬箱的離散化特徵,默認情況下,輸出是one-hot編碼成稀疏矩陣,並且可以使用encode參數。對於每個特性,在fit再加上分箱的數量,他們會定義間隔。

sklearn.preprocessing.KBinsDiscretizer(n_bins=5, encode=’onehot’, strategy=’quantile’)

在這裏插入圖片描述

2. Binarizer

根據閾值將數據二值化(將特徵值設置爲0或1),用於處理連續型變量。大於閾值的值映射爲1,而小於或等於閾值的值映射爲0。默認閾值爲0時,特徵中所有的正值都映射到1。二值化是對文本計數數據的常見操作,分析人員可以決定僅考慮某種現象的存在與否。

sklearn.preprocessing.Binarizer(threshold=0.0, copy=True)

當k=2時,當bin邊處於值閾值時,Binarizer類似於KBinsDiscreizer。

6. 缺失值處理(Imputer)

針對於最新的0.20.0版本的scikit-learn中,Imputer好象是被取代了換成了sklearn.impute這裏麪包含兩個類:

sklearn.impute.SimpleImputer(missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)
sklearn.impute.MissingIndicator(missing_values=nan, features=’missing-only’, sparse=’auto’, error_on_new=True)

由於用的較多的是SimpleImputer,下面給出一般參數:
在這裏插入圖片描述

7. 生成多項式特徵(PolynomialFeatures)

在機器學習中,通過增加一些輸入數據的非線性特徵來增加模型的複雜度通常是有效的。一個簡單通用的辦法是使用多項式特徵,這可以獲得特徵的更高維度和互相間關係的項。多項式特徵經常用於使用多項式核函數的核方法(比如SVC和KernelPCA)。這在 PolynomialFeatures 中實現:

sklearn.preprocessing.PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)

8. 自定義轉換器(FunctionTransformer)

我們經常希望將一個Python的函數轉變爲transformer,用於數據清洗和預處理。可以使用FunctionTransformer方法將任意函數轉化爲一個Transformer。

sklearn.preprocessing.FunctionTransformer(func=None, inverse_func=None, validate=None, 
accept_sparse=False, pass_y=’deprecated’, check_inverse=True, kw_args=None, inv_kw_args=None)

總結

自0.20.0版本的scikit-learn中,變化還是挺大的,其中有些類增加了,有些類減少了(其他模塊中去了)。所以對於新的知識個人建議去scikit-learn官網中進行查找閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章