1. 程式人生 > 其它 >使用scikit-learn對資料進行預處理

使用scikit-learn對資料進行預處理

技術標籤:資料分析人工智慧資料探勘機器學習大資料

歡迎關注”生信修煉手冊”!

資料的質量決定了模型的上限,在真實的資料分析中,輸入的資料會存在缺失值,不同特徵的取值範圍差異過大等問題,所以首先需要對資料進行預處理。

預處理是資料探勘的第一步,該步驟實際上包含了很多不同的操作手法,大致分為以下幾類

1. 缺失值的處理,當樣本量很大,缺失值很少時,直接刪除缺失值對應的樣本,並不會導致樣本規模的大幅下降,此時直接刪除缺失值是一種可取的辦法,但是對於小樣本量,且缺失值較多的場景,就需要考慮對缺失值進行插補

2. 標準化,很多的機器學習演算法對特徵的分佈是有預定的假設的,比如需要服從正態分佈,對於不符合分佈的資料,需要進行標準化,轉化為正態分佈,另外,考慮到不同特徵的量綱不同,也需要進行縮放,比如到縮放到0到1的區間,保證了不同特徵在模型中的可比性

3. 稀疏化,也叫做離散化,指的是根據業務場景對特徵進行分段處理,比如按照某個閾值,將考試分數劃分為及格和不及格兩類,從而將連續性的數值變換為0,1兩個離散型的變數

4. 特徵編碼,對於分類變數,近期對映為數值型

5. 特徵提取,適用於自然語言處理,圖形識別領域的機器學習,因為原始的資料資料是文字,影象等資料,不能直接用於建模,所以需要通過特徵提取轉換為適合建模的矩陣資料

在scikit-learn中,在preprocessing子模組中提供了多種預處理的方法,具體用法如下

1.標準化

標準化的目標是使得變數服從標準正態分佈,標準化的方式如下

程式碼如下

>>> from sklearn import preprocessing
>>> import numpy as np
>>> x = np.array([1, -2, 3, -4, 5, 6]).reshape(-1, 1)
>>> x
array([[ 1],
[-2],
[ 3],
[-4],
[ 5],
[ 6]])
>>> scaler = preprocessing.StandardScaler().fit(x)
>>> x_scaled = scaler.transform(x)
>>> x_scaled
array([[-0.13912167],
[-0.97385168],
[ 0.41736501],
[-1.53033836],
[ 0.97385168],
[ 1.25209502]])
```

2. 線性縮放

適合針對標準差很小的資料集進行處理,根據資料的最大值和最小值,將原始資料縮放到0到1這個區間程式碼如下

>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> x_scaled = min_max_scaler.fit_transform(x)
>>> x_scaled
array([[0.5],
[0.2],
[0.7],
[0. ],
[0.9],
[1. ]])

也可以通過feature_range引數設定具體的縮放區間

>>> min_max_scaler = preprocessing.MinMaxScaler(feature_range=(-5, 5))
>>> x_scaled = min_max_scaler.fit_transform(x)
>>> x_scaled
array([[ 0.],
[-3.],
[ 2.],
[-5.],
[ 4.],
[ 5.]])

還有一種方法是根據最大絕對值進行縮放,適合稀疏資料或者是早已經中心化的資料,可以縮放到-1到1的區間,程式碼如下

>>> max_abs_scaler = preprocessing.MaxAbsScaler()
>>> x_scaled = max_abs_scaler.fit_transform(x)
>>> x_scaled
array([[ 0.16666667],
[-0.33333333],
[ 0.5 ],
[-0.66666667],
[ 0.83333333],
[ 1. ]])

3.非線性變換

包括分位數變換和冪變換兩種,分位數變換,預設對樣本量大於1000的資料進行變化,採用分位數對原始資料劃分,預設將資料對映為0到1的均勻分佈,程式碼如下

>>> x = np.random.random(10000).reshape(-1, 1)
>>> x_scaled = quantile_transformer.fit_transform(x)

也可以輸出符合正態分佈的資料,程式碼如下

>>> quantile_transformer = preprocessing.QuantileTransformer(output_distribution='normal')
>>> x_scaled = quantile_transformer.fit_transform(x)

冪變換,用於穩定方差,將資料處理為近似正態分佈,程式碼如下

>>> pt = preprocessing.PowerTransformer(method='box-cox', standardize=False)
>>> x_scaled = pt.fit_transform(x)

4. 正則化

程式碼如下

>>> x_normalized = preprocessing.normalize(x, norm='l2')
>>> x_normalized = preprocessing.Normalizer(norm='l2').fit_transform(x)

5. 特徵編碼

將離散的分型別變數轉換為數值型,程式碼如下

>>> x = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
>>> preprocessing.OrdinalEncoder().fit_transform(x)
array([[1., 1., 1.],
[0., 0., 0.]])

6.離散化

將連續變數進行分組,比如將原始資料劃分為不同的區間,稱之為bin,程式碼如下

>>> X = np.array([[ -3., 5., 15 ],[ 0., 6., 14 ],[ 6., 3., 11 ]])
>>> X
array([[-3., 5., 15.],
[ 0., 6., 14.],
[ 6., 3., 11.]])
>>> est = preprocessing.KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal').fit(X)
>>> est.transform(X)
array([[0., 1., 1.],
[1., 1., 1.],
[2., 0., 0.]])

n_bins引數指定bin的個數,轉換後的數值為原始數值對應的bin的下標。

二值化變換,也是一種離散化的操作,通過某個閾值將數值劃分為0和1兩類,公式如下

程式碼如下

>>> X = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
>>> X
array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
>>> binarizer = preprocessing.Binarizer(threshold=1.1).fit(X)
>>> binarizer.transform(X)
array([[0., 0., 1.],
[1., 0., 0.],
[0., 0., 0.]])

7. 多項式構建

多項式的構建相當於升維操作,在原來獨立的特徵x1, x2的基礎上,構建起平方以及乘積的新變數,轉換到方式如下

程式碼如下

>>> from sklearn.preprocessing import PolynomialFeatures
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1],
[2, 3],
[4, 5]])
>>> poly = PolynomialFeatures().fit_transform(X)
>>> poly
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])

8.自定義

為了提供更加靈活的預處理方式,還支援自定義預處理的邏輯,程式碼如下

>>> from sklearn.preprocessing import FunctionTransformer
>>> transformer = FunctionTransformer(np.log1p, validate=True)
>>> X = np.array([[0, 1], [2, 3]])
>>> trans = transformer.fit_transform(X)
>>> trans
array([[0. , 0.69314718],
[1.09861229, 1.38629436]])

通過自定義函式來保證靈活性。對於缺失值的填充,有專門的impute子模組來進行處理,在後續的文章中再詳細介紹。

·end·

—如果喜歡,快分享給你的朋友們吧—

原創不易,歡迎收藏,點贊,轉發!生信知識浩瀚如海,在生信學習的道路上,讓我們一起並肩作戰!

本公眾號深耕耘生信領域多年,具有豐富的資料分析經驗,致力於提供真正有價值的資料分析服務,擅長個性化分析,歡迎有需要的老師和同學前來諮詢。

更多精彩

寫在最後

轉發本文至朋友圈,後臺私信截圖即可加入生信交流群,和小夥伴一起學習交流。

掃描下方二維碼,關注我們,解鎖更多精彩內容!

一個只分享乾貨的

生信公眾號