机器学习笔记——特征标准化

机器学习笔记——特征标准化

 

 

数据标准化是在特征处理环节必不可少的重要步骤。

数据标准化是为了消除不同指标量纲的影响,方便指标之间的可比性,量纲差异会影响某些模型中距离计算的结果。

常见标准化方法主要有归一化、正态化。

数据归一化也即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

 

 

 

请使用浏览器的分享功能分享到微信等