機器學習筆記——特徵標準化

dicksonjyl560101發表於2018-10-24

機器學習筆記——特徵標準化

 

 

資料標準化是在特徵處理環節必不可少的重要步驟。

資料標準化是為了消除不同指標量綱的影響,方便指標之間的可比性,量綱差異會影響某些模型中距離計算的結果。

常見標準化方法主要有歸一化、正態化。

資料歸一化也即0-1標準化,又稱最大值-最小值標準化,核心要義是將原始指標縮放到0~1之間的區間內。相當於對原變數做了一次線性變化。

其公式為  EX = (x- min)/(max - min)

另一種常用的標準化方法是z-score標準化,將原始指標標準化為均值為0,標準化為1的正態分佈。

EX = (x - mean)/σ

R 語言中的特徵標準化:

library ( "caTools" )
library ( "scales" )

data(iris)

split = sample.split(iris$Species,SplitRatio =
.8 )

train_data = subset(iris,split == TRUE)

test_data  = subset(iris,split == FALSE)

 

train_data[,- 5 ] = apply(train_data[,- 5 ], 2 ,rescale,to = c( , 1 ))

test_data[,- 5 ] = apply(test_data[,- 5 ], 2 ,rescale,to = c( , 1 ))

以上scales包中的rescale函式可以自動完成指標中0-1標準化的任務,事實上,它可以將原始指標線性變化到任何一個數字區間內。

我們可以來驗證結果是否是可信的。

range(train_data[, 1 ])

range(apply(train_data[,- 5 ], 2 ,rescale,to = c( , 1 ))[, 1 ])

 

[ 1 ] 4.3 7.7
[ 1 ] 1

當然你也可以自己寫一個叫簡單的0-1標準化函式

scale1 = function (x){

(x - min(x))/(max(x) - min(x))

}

range(apply(train_data[,- 5 ], 2 ,scale1)[, 1 ])

[ 1 ] 1

z-score 標準化

z-score 標準化可以透過scale函式快速實現。

train_data[,- 5 ] = scale(train_data[,- 5 ])

 

mean(train_data[, 1 ]);sd(train_data[, 1 ])

[ 1 ] 5.869167
[ 1 ] 0.8259241

mean(scale(train_data[,- 5 ])[, 1 ]);sd(scale(train_data[,- 5 ])[, 1 ])

[ 1 ]
[ 1 ] 1

# 自定義一個z-score標準化函式

z_norm = function (x){

  (x - mean(x))/sd(x)

}

 

mean(apply(train_data[,- 5 ], 2 ,z_norm)[, 1 ]);sd(apply(train_data[,- 5 ], 2 ,z_norm)[, 1 ])

[ 1 ]
[ 1 ] 1

Python 中sk-learn庫中有專門用於處理以上兩種標準化的函式。

from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import pandas as pd import numpy as np

 

iris  = load_iris()

data = iris[ 'data' ]

iris_data = pd.DataFrame(

         data = data,

         columns = [ 'sepal_length' , 'sepal_width' , 'petal_length' , 'petal_width' ]

        )

iris_data[ "Species" ] = iris[ 'target' ]

iris_data[ "Species" ] = iris_data[ "Species" ].map({ : "setosa" , 1 : "versicolor" , 2 : "virginica" })

x,y = iris_data.iloc[:, :- 1 ],iris_data.iloc[:,- 1 ]

train_data,_data,train_target,test_target = train_test_split(x,y,test_size = 0.2 ,stratify = y)

Python 中的0-1標準化

min_max_scaler = preprocessing.MinMaxScaler() # 例項化0-1標準化方法
X_train_minmax = min_max_scaler.fit_transform(test_data.iloc[:, : 4 ].values)

X_test_minmax  = min_max_scaler.transform(test_data.iloc[:, : 4 ].values)

 

X_train_minmax[:, ].max() - X_train_minmax[:, ].min() 1.0

Python 中的z-score標準化

訓練集第一列的均值和方差如下

train_data.iloc[:, ].mean();train_data.iloc[:, ].std()
5.86166666666666
40.8416853174847874
sc_X = preprocessing.StandardScaler()     # 例項化z-score標準化方法
X_train = sc_X.fit_transform(train_data.iloc[:, : 4 ].values)

X_test  = sc_X.transform(test_data.iloc[:, : 4 ].values)

 

標準化後第一列的均值和方差

X_train[:, ].mean();X_train[:, ].std()

- 2.2907601741432396e-151.0

以上僅介紹了最常用的兩種標準化特徵的方法及其實現,標準化的方法還有很多,對於什麼的模型需要使用標準化以及適用什麼方法的標準化,需要視具體場景和資料量級差異而定,小編也在摸索中。

標準化一方面可以防止原始特徵中量綱差異影響距離運算(比如歐氏距離的運算)。
另一方面標準化也可以在一定程度上提升演算法求解的效率。

 

 

https://mp.weixin.qq.com/s/z97Wtes-tfXQYDl-xx_cBg

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2217302/,如需轉載,請註明出處,否則將追究法律責任。

相關文章