sklearn.preprocessing歸一化標准化等


目錄

sklearn.preprocessing

  1. StandardScaler,標准化,也叫z-score規范化
  2. 最小-最大規范化
  3. 正則化(normalize)
  4. one-hot編碼
  5. 特征二值化
  6. 標簽編碼(Label encoding)

 

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])

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM