本文將以iris數據集為例,梳理數據挖掘和機器學習過程中數據預處理的流程。在前期階段,已完成了數據采集、數據格式化、數據清洗和采樣等階段。通過特征提取,能得到未經處理的特征,但特征可能會有如下問題:
- 不屬於同一量綱 通常采用無量綱化進行處理;
- 信息冗余
- 定性特征不能直接使用 通常使用啞編碼的方式將定性特征轉換為定量特征;
- 存在缺失值
- 信息利用率低 不同的機器學習算法和模型對數據中信息的利用是不同的,之前提到在線性模型中,使用對定性特征啞編碼可以達到非線性的效果。類似地,對定量變量多項式化,或者進行其他的轉換,都能達到非線性的效果。
首先導入iris數據集,
from sklearn.datasets import load_iris #導入IRIS數據集 iris = load_iris() #特征矩陣 iris.data #目標向量 iris.target
1 無量綱化
無量綱化使不同規格的數據轉換到同一規格。常見的無量綱化方法有標准化和區間縮放法。標准化的前提是特征值服從正態分布,標准化后,其轉換成標准正態分布。區間縮放法利用了邊界值信息,將特征的取值區間縮放到某個特點的范圍,例如[0, 1]等。
1.1 標准化
標准化需要計算特征的均值和標准差,公式表達為:

使用preproccessing庫的StandardScaler類對數據進行標准化的代碼如下:
from sklearn.preprocessing import StandardScaler #標准化,返回值為標准化后的數據 StandardScaler().fit_transform(iris.data)
1.2 區間縮放法
區間縮放法的思路有多種,常見的一種為利用兩個最值進行縮放,公式表達為:

使用preproccessing庫的MinMaxScaler類對數據進行區間縮放的代碼如下:
from sklearn.preprocessing import MinMaxScaler #區間縮放,返回值為縮放到[0, 1]區間的數據 MinMaxScaler().fit_transform(iris.data)
1.3 歸一化
簡單來說,標准化是依照特征矩陣的列處理數據,其通過求z-score的方法,將樣本的特征值轉換到同一量綱下。歸一化是依照特征矩陣的行處理數據,其目的在於樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標准,也就是說都轉化為“單位向量”。歸一化類型包括:線性歸一化、標准差歸一化和非線性歸一化。規則為l2的歸一化公式如下:

使用preproccessing庫的Normalizer類對數據進行歸一化的代碼如下:
from sklearn.preprocessing import Normalizer #歸一化,返回值為歸一化后的數據 Normalizer().fit_transform(iris.data)
2 對定量特征二值化
定量特征二值化的核心在於設定一個閾值,大於閾值的賦值為1,小於等於閾值的賦值為0,公式表達如下:

使用preproccessing庫的Binarizer類對數據進行二值化的代碼如下:
from sklearn.preprocessing import Binarizer #二值化,閾值設置為3,返回值為二值化后的數據 Binarizer(threshold=3).fit_transform(iris.data)
3 對定性特征啞編碼
one-hot編碼是指將一個無序的類別變量k個值就轉換成k個虛擬變量。
使用preproccessing庫的OneHotEncoder類對數據進行啞編碼的代碼如下:
from sklearn.preprocessing import OneHotEncoder #啞編碼,對IRIS數據集的目標值,返回值為啞編碼后的數據 OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))
4 缺失值計算
使用preproccessing庫的Imputer類對數據進行缺失值計算的代碼如下:
from numpy import vstack, array, nan from sklearn.preprocessing import Imputer #缺失值計算,返回值為計算缺失值后的數據 #參數missing_value為缺失值的表示形式,默認為NaN #參數strategy為缺失值填充方式,默認為mean(均值) Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
5 數據變換
常見的數據變換有基於多項式的、基於指數函數的、基於對數函數的。
使用preproccessing庫的PolynomialFeatures類對數據進行多項式轉換的代碼如下:
from sklearn.preprocessing import PolynomialFeatures #多項式轉換 #參數degree為度,默認值為2 PolynomialFeatures().fit_transform(iris.data)
基於單變元函數的數據變換可以使用一個統一的方式完成,使用preproccessing庫的FunctionTransformer對數據進行對數函數轉換的代碼如下:
from numpy import log1p from sklearn.preprocessing import FunctionTransformer #自定義轉換函數為對數函數的數據變換 #第一個參數是單變元函數 FunctionTransformer(log1p).fit_transform(iris.data)
6 sklearn數據包功能總結
類
|
功能
|
說明
|
StandardScaler
|
無量綱化
|
標准化,基於特征矩陣的列,將特征值轉換至服從標准正態分布
|
MinMaxScaler
|
無量綱化
|
區間縮放,基於最大最小值,將特征值轉換到[0, 1]區間上
|
Normalizer
|
歸一化
|
基於特征矩陣的行,將樣本向量轉換為“單位向量”
|
Binarizer
|
二值化
|
基於給定閾值,將定量特征按閾值划分
|
OneHotEncoder
|
啞編碼
|
將定性數據編碼為定量數據
|
Imputer
|
缺失值計算
|
計算缺失值,缺失值可填充為均值等
|
PolynomialFeatures
|
多項式數據轉換
|
多項式數據轉換
|
FunctionTransformer
|
自定義單元數據轉換
|
使用單變元的函數來轉換數據
|