天天看點

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:

目錄

一:sklearn中的歸一化

1)均值-标準差縮放--StandardScaler() (常用)

2)min-max标準化--MinMaxScaler()

3)最大值标準化--MaxAbsScaler()

4)規範化--normalize()

5)二值化--Binarizer()

6)編碼的分類特征--OneHotEncoder() (常用)

7)填補缺失值--Imputer()

8)生成多項式特征--PolynomialFeatures() (常用)

二 .補充:python實作資料歸一化:

一:sklearn中的歸一化

1)均值-标準差縮放--StandardScaler()

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:

目的:使資料成正态分布, 均值為0,方差為1

在sklearn的學習中,資料集的标準化是很多機器學習模型算法的常見要求。如果個别特征看起來不是很符合正态分布,那麼他們可能為表現不好。

實際上,我們經常忽略分布的形狀,隻是通過減去整組資料的均值,使之更靠近資料中心分布,然後通過将非連續數特征除以其标準偏差進行分類。

例如,用于學習算法(例如支援向量機的RBF核心或線性模型的l1和l2正則化器)的目标函數中使用的許多元素假設所有特征都以零為中心并且具有相同順序的方差。如果特征的方差大于其他數量級,則可能主導目标函數,使估計器無法按預期正确地學習其他特征。

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X_train)
print(X_scaled)

output:
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])
           

預處理子產品還提供了一個實用程式集StandardScaler,它實作了Transformer API來計算訓練集上的平均值和标準偏差,以便在測試集上應用相同的變換。

StandardScaler(copy=True, with_mean=True, with_std=True)

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])

scaler = preprocessing.StandardScaler().fit(X_train)
X_test = [[-1., 1., 0.]]
scaler.transform(X_test)

output:
array([[-2.44948974,  1.22474487, -0.26726124]])
           

2)min-max标準化--MinMaxScaler()

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
...                      [ 2.,  0.,  0.],
...                      [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
print(X_train_minmax)

output:
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])
           

用于新的測試資料

X_test = np.array([[ -3., -1.,  4.]])
X_test_minmax = min_max_scaler.transform(X_test)
print(X_test_minmax)

output:
array([[-1.5       ,  0.        ,  1.66666667]])
           

3)最大值标準化--MaxAbsScaler()

from sklearn import preprocessing
import numpy as np
X_train=array([[ 1., -1.,  2.],
       [ 2.,  0.,  0.],
       [ 0.,  1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
print(X_train_maxabs)

output:
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])
           

用于新的測試資料

X_test = np.array([[ -3., -1.,  4.]])
X_test_maxabs = max_abs_scaler.transform(X_test)
print(X_test_maxabs)

output:
array([[-1.5, -1. ,  2. ]])
           

4)規範化--normalize()

Normalizer(copy=True, norm='l2')

規範化是文本分類和聚類中向量空間模型的基礎

from sklearn import preprocessing
import numpy as np
X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')
print(X_normalized)

output:
array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])
           

使用方法2

from sklearn import preprocessing
import numpy as np
X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)

output:
array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])

normalizer.transform([[-1,1,0]])

output:
array([[-0.70710678,  0.70710678,  0.        ]])
           

5)二值化--Binarizer()

将資料轉換到0-1 之間

from sklearn import preprocessing
import numpy as np
x=[[1.0, -1.0, 2.0],
   [2.0, 0.0, 0.0], 
   [0.0, 1.0, -1.0]]
binarizer = preprocessing.Binarizer().fit(X)
output=binarizer.transform(X)
print(output)

array([[ 1.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])
           

6)編碼的分類特征--OneHotEncoder()

OneHotEncoder(n_values=’auto’, categorical_features=’all’, dtype=<class ‘numpy.float64’>, sparse=True, handle_unknown=’error’)

n_values=’auto’:表示每個特征使用幾維的數值由資料集自動推斷,即幾種類别就使用幾位來表示。當然也可以自己指定,

如果訓練樣本中有丢失的分類特征值,我們就必須顯示地設定參數 

n_values

 了,這樣防止編碼出錯。

categorical_features ='all'或columns_list,這個參數指定了對哪些特征進行編碼,預設對所有類别都進行編碼。也可以自己指定選擇哪些特征,通過索引或者 bool 值來指定

dtype=<class ‘numpy.float64’> 表示編碼數值格式,預設是浮點型。

sparse=True 表示編碼的格式,預設為 True,即為稀疏的格式,指定 False輸出為array 

handle_unknown=’error’,其值可以指定為 "error" 或者 "ignore",即如果碰到未知的類别,是傳回一個錯誤還是忽略它。

from sklearn.preprocessing import  OneHotEncoder
enc = OneHotEncoder(sparse=False,handle_unknown="ignore")
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 1, 3]])
print(ans) 

output:
 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]
           

注釋:

1.我們先來看第一個特征,即第一列 [0,1,0,1][0,1,0,1],也就是說它有兩個取值 0 或者 1,那麼 one-hot 就會使用兩位來表示這個特征,[1,0][1,0] 表示 0, [0,1][0,1] 表示 1,在上例輸出結果中的前兩位 [1,0...][1,0...] 也就是表示該特征為 0

2.第二個特征,第二列 [0,1,2,0][0,1,2,0],它有三種值,那麼 one-hot 就會使用三位來表示這個特征,[1,0,0][1,0,0] 表示 0, [0,1,0][0,1,0] 表示 1,[0,0,1][0,0,1] 表示 2,在上例輸出結果中的第三位到第六位 [...0,1,0,0...][...0,1,0,0...] 也就是表示該特征為 1

3.第二個特征,第三列 [3,0,1,2][3,0,1,2],它有四種值,那麼 one-hot 就會使用四位來表示這個特征,[1,0,0,0][1,0,0,0] 表示 0, [0,1,0,0][0,1,0,0] 表示 1,[0,0,1,0][0,0,1,0] 表示 2,[0,0,0,1][0,0,0,1] 表示 3,在上例輸出結果中的最後四位 [...0,0,0,1][...0,0,0,1] 也就是表示該特征為 3

7)填補缺失值--Imputer()

Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)

主要參數說明:

missing_values:缺失值,可以為整數或NaN(缺失值numpy.nan用字元串‘NaN’表示),預設為NaN

strategy:替換政策,字元串,預設用均值‘mean’替換

①若為mean時,用特征列的均值替換

②若為median時,用特征列的中位數替換

③若為most_frequent時,用特征列的衆數替換

axis:指定軸數,預設axis=0代表列,axis=1代表行

copy:設定為True代表不在原資料集上修改,設定為False時,就地修改,存在如下情況時,即使設定為False時,也不會就地修改

from sklearn.preprocessing  import Imputer
import numpy as np 
import pandas as pd 

df=pd.DataFrame(np.arange(9).reshape(3,3))
df[1][1]=np.nan
df[2][2]=np.nan
print(df)

output:
array([[0. , 1. , 2. ],
       [3. , NAN , 5. ],
       [6. , 7. , NAN]])

column_names=df.columns
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
df=imp.fit_transform(df)
#或 :
#imp=imp.fit(df)
#df=imp.transform(df)

df=pd.DataFrame(df,columns=column_names)
print(df)
           

output:

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:

8)生成多項式特征--PolynomialFeatures()

通常,通過考慮輸入資料的非線性特征來增加模型的複雜度是很有用的。一個簡單而常用的方法是多項式特征,它可以得到特征的高階和互相作用項。

其遵循的原則是 

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
print(X) 

output:                                               
array([[0, 1],
       [2, 3],
       [4, 5]])

poly = PolynomialFeatures(2)
X=poly.fit_transform(X) 
print(X)

output:
array([[  1.,   0.,   1.,   0.,   0.,   1.],
       [  1.,   2.,   3.,   4.,   6.,   9.],
       [  1.,   4.,   5.,  16.,  20.,  25.]])
           

有些情況下,有互相關系的标簽才是必須的,這個時候可以通過設定 interaction_only=True 來進行多項式特征的生成

poly = PolynomialFeatures(degree=3, interaction_only=True)
X=poly.fit_transform(X)   
print(X)

output:                          
array([[   1.,    0.,    1.,    2.,    0.,    0.,    2.,    0.],
       [   1.,    3.,    4.,    5.,   12.,   15.,   20.,   60.],
       [   1.,    6.,    7.,    8.,   42.,   48.,   56.,  336.]])
           

二 .補充:python實作資料歸一化:

資料歸一化(标準化)處理是資料挖掘的一項基礎工作,不同評價名額往往具有不同的量綱和量綱機關,這樣的情況會影響到資料分析的結果,為了消除名額之間的量綱影響,需要進行資料标準化處理,以解決資料名額之間的可比性。原始資料經過資料标準化處理後,各名額處于同一數量級,适合進行綜合對比評價。

歸一化方法有兩種形式,一種是把數變為(0,1)之間的小數,一種是把有量綱表達式變為無量綱表達式。在機器學習中我們更關注的把資料變到0~1之間,接下來我們讨論的也是第一種形式。

1)min-max标準化

1.min-max标準化也叫做離差标準化,是對原始資料的線性變換,使結果落到[0,1]區間,其對應的數學公式如下:

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:
def Normalization(x):
    return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]
           

2.如果要将資料轉換到[-1,1]之間,可以修改其數學公式為:

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:
import numpy as np
def Normalization(x):
    return [(float(i)-np.mean(x))/float(max(x)-min(x)) for i in x]
           

這種方法有個缺陷就是當有新資料加入時,可能導緻max和min的變化,需要重新定義。

該标準化方法有一個缺點就是,如果資料中有一些偏離正常資料的異常點,就會導緻标準化結果的不準确性。比如說一個公司員工(A,B,C,D)的薪水為6k,8k,7k,10w,這種情況下進行歸一化對每個員工來講都是不合理的。

2)z-score标準化

z-score标準化也叫标準差标準化,代表的是分值偏離均值的程度,經過處理的資料符合标準正态分布,即均值為0,标準差為1。其轉化函數為

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:

其中μ為所有樣本資料的均值,σ為所有樣本資料的标準差。

import numpy as np
def z_score(x):
    return (x - np.mean(x) )/np.std(x, ddof = 1)
           

z-score标準化方法對于離群異常值的影響。接下來看一種改進的z-score标準化方法。

3) 改進的z-score标準化

将标準分公式中的均值改為中位數,将标準差改為絕對偏差。

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:

中位數是指将所有資料進行排序,取中間的那個值,如資料量是偶數,則取中間兩個資料的平均值。

σ1為所有樣本資料的絕對偏差,其計算公式為: 

特征工程之'sklearn--preprocessing包'一:sklearn中的歸一化 二 .補充:python實作資料歸一化:

1-6參考  https://blog.csdn.net/tongjinrui/article/details/79510720 

onehot參考:https://www.cnblogs.com/zhoukui/p/9159909.html

scikit-learn資料為: http://scikit-learn.org/stable/modules/preprocessing.html