目錄
sklearn.preprocessing
sklearn.preprocessing
屬於數據預處理階段,經過一定縮放,標准化等處理使得數據能被模型識別
sklearn.preprocessing 有多個縮放器(Scaler):
- StandardScaler
- MinMaxScaler
- RobustScaler
- Normalizer
還有可以直接使用的函數:scale(),maxabs_scale(),minmax_scale(),robust_scale(),normaizer()
1.StandardScaler,標准化,也叫z-score規范化
z = (x - u) / s
其中u是訓練樣本或者特征的均值,s是訓練樣本或者特征的標准偏差,z是標准化之后的值
這個方法被廣泛使用在支持向量機,邏輯回歸神經網絡等
StandardScaler有fit,fit_transform,transform等方法
fit:用於計算訓練數據的均值和方差
fit_transform:不僅計算訓練數據的值和方差,還會基於計算出來的均值方差來轉換訓練數據,將數據轉為標准正態分布
transform:只進行轉換,把數據轉換成標准正態分布
一般會把train和test集放在一起做標准化,或者在train集上做標准化后,用同樣的標准化器去標准化test集
from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import numpy as np iris=load_iris() df=pd.DataFrame(iris.data,columns=iris.feature_names) df['sample']=iris.target train_x=df.iloc[:,:4] train_y=df.iloc[:,-1] x_train,x_test,y_train,y_test=train_test_split(train_x,train_y,test_size=0.3,random_state=0) #一般這樣使用,其中fit_transform可以代替fit位置 scaler=preprocessing.StandardScaler().fit(x_train) scaler.transform(x_train) scaler.transform(x_test)
其中計算原理,標准化之后的值如下:
#(x-均值)/標准差 (x_train.values[:,0]- x_train.values[:,0].mean())/ x_train.values[:,0].std()
2.最小-最大規范化
使用這個縮放的情況包括:增強極小方差的值還有保留稀疏樣本中的零值。也叫作最大最小標准化,[0,1]標准化
對原始數據的線性變換,使得結果落在[ 0,1 ]區間,
z=(x-min)/(max-min)
這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義
#feature_range: 定義歸一化范圍,注用()括起來 scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)).fit(train_data) scaler.transform(train_data) scaler.transform(test_data)
還有一個例子:
import numpy as np from sklearn import preprocessing X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) min_max_sacler = preprocessing.MinMaxScaler() min_max_sacler.fit(X_train) print(min_max_sacler.transform(X_train)) ''' [[0.5 0. 1. ] [1. 0.5 0.33333333] [0. 1. 0. ]] '''
3.正則化(normalize)
首先求出樣本的p范數,然后該樣本的所有元素都要除以該范數,這樣最終使得每個樣本的范數都是1。
規范化(Normalization)是將不同變化范圍的值映射到相同的固定范圍,常見的是[0,1],也成為歸一化
該方法主要應用於文本分類和聚類中
sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)
norm:可以為l1、l2或max,默認為l2
- 若為l1時,每個樣本(每行)的值除以每個樣本(每行)各值的絕對值之和
- 若為l2時,變換后每個樣本(每行)的各維特征的平方和為1
- 若為max時,樣本各個特征值除以樣本中特征值最大的值
也有這樣的說法:
需要說明是,這里的歸一化不是對一列的特征進行操作,而是對一行的樣本(記錄)進行操作。歸一化適用於這樣的場景:需要使用點積,或者有的模型需要對樣本的相似性進行度量。
preprocessing中的normalize方法提供了這樣的操作,這個方法有個參數叫做norm,取值可以為 ‘l1’,’l2’,’max’,取不同的值,使用不同的方式進行歸一化。
當取值為’l1‘的時候,運用l1范數進行歸一化,計算的方法是 :

運用l2范數進行歸一化的時候,計算方法是這樣的:

preproceing 的Normalizer也提供了標准化的方法,可以進行fit和transform操作,而preprocessing.normalize()函數不可以
from sklearn import preprocessing X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] #1、可以使用preprocessing.normalize()函數對指定數據進行轉換: preprocessing.normalize(X, norm='l2') ''' array([[ 0.40824829, -0.40824829, 0.81649658], [ 1. , 0. , 0. ], [ 0. , 0.70710678, -0.70710678]]) ''' preprocessing.normalize(X, norm='l1') ''' array([[ 0.25, -0.25, 0.5 ], [ 1. , 0. , 0. ], [ 0. , 0.5 , -0.5 ]]) ''' preprocessing.normalize(X, norm='max') ''' array([[ 0.5, -0.5, 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -1. ]]) ''' #2、可以使用processing.Normalizer()類實現對訓練集和測試集的擬合和轉換: normalizer = preprocessing.Normalizer().fit(X)#fit does nothing normalizer #Normalizer(copy=True, norm='l2') normalizer.transform(X) normalizer.transform([[-1., 1., 0.]]) # array([[-0.70..., 0.70..., 0. ...]])
norm不同算法:
#norm='l2', X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] X=np.array(X) X/np.sqrt(np.sum(X*X,axis=1)) #norm='l1' X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] X=np.array(X) X/np.sum(abs(X),axis=1) #norm='max' X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] X=np.array(X) X/np.max(X,axis=0)
4.one-hot編碼
one-hot編碼是一種對離散特征值的編碼方式,在LR模型中常用到,用於給線性模型增加非線性能力
就是看看每個特征有多少個唯一值n,然后組成n列,按照順序排唯一值,如果輪到該值,則1,其余是0
from sklearn import preprocessing data = [[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]] encoder = preprocessing.OneHotEncoder().fit(data) encoder.transform(data).toarray() #輸出 array([[1., 0., 1., 0., 0., 0., 0., 0., 1.], [0., 1., 0., 1., 0., 1., 0., 0., 0.], [1., 0., 0., 0., 1., 0., 1., 0., 0.], [0., 1., 1., 0., 0., 0., 0., 1., 0.]])
5.特征二值化
Binarizer類和binarize方法根據指定的閾值將特征二值化,小於等於閾值的,將特征值賦予0,大於特征值的賦予1,其閾值threshold默認都為0
sklearn.preprocessing.binarize(X, threshold=0.0, copy=True)
binarizer = sklearn.preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
6.標簽編碼(Label encoding)
sklearn.preprocessing.LabelEncoder():標准化標簽,將標簽值統一轉換成range(標簽值個數-1)范圍內
from sklearn import preprocessing le = preprocessing.LabelEncoder() le.fit([1,2,2,6,3]) #獲取標簽值 le.classes_ #array([1, 2, 3, 6]) #將標簽標准化 le.transform([1, 1, 2, 6]) #array([0, 0, 1, 2]) #將標准化的標簽值反轉 le.inverse_transform([0, 0, 2, 3, 1]) #array([1, 1, 3, 6, 2]) #非數值型轉化為數值型 le.fit(["paris", "paris", "tokyo", "amsterdam"]) le.transform(["tokyo", "tokyo", "paris"]) #array([2, 2, 1])
