规范化:标准化、归一化、中心化

参考:重温归一化(MinMaxScaler)和标准化(StandardScaler)_Miracle8070-CSDN博客_standardscaler和minmaxscaler

数据挖掘中数据变换比算法选择更重要

目录

一、介绍

二、为什么要规范化?

三、如何选择

1、归一化

2、标准化

3、不需要标准化的模型

4、特殊说明

5、逻辑回归必须要标准化吗

三、实现

1、归一化

2、标准化(Z-Score 规范化)

3、 小数定标规范化

​四、总结


一、介绍

1、归一化(Normalization)

概念:数值的归一,将数值规约到(0,1)或(-1,1)区间

目的:消除量纲,便于不同单位或量级的指标能够进行比较和加权。 

2、标准化(Standardization)

概念:数据分布的归一,原始数据减均值之后,再除以标准差。将数据变换为均值为0,标准差为1的分布,切记:并非一定是正态的。

目的:消除量纲,便于后续的梯度下降和激活函数对数据的处理。因为标准化后,数据以0为中心左右分布,而函数sigmoid,Tanh,Softmax等也都以0为中心左右分布;

3、中心化 (Zero-centered)

概念:中心化,也叫零均值处理,就是将每个原始数据减去这些数据的均值。因此 中心化后的数据平均值为0,对标准差无要求。

二、为什么要规范化?

如前文所说,归一化/标准化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化/标准化的前提。比如有一个很重要的性质:线性变换不会改变原始数据的数值排序。

1、数据的量纲不同;数量级差别很大

经过规范化处理后,原始数据转化为无量纲化指标测评值,各指标值处于同一数量级别,可进行综合测评分析。

如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。

2、避免数值问题:太大的数会引发数值问题。

3、平衡各特征的贡献

一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。

如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

4、一些模型求解的需要:加快了梯度下降求最优解的速度

在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。如左图所,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。

三、如何选择

1、归一化

  1. 对输出结果范围有要求
  2. 数据较为稳定,不存在极端值
  3. 不涉及距离度量、协方差计算的时候
  4. 数据不符合正态分布的时候

2、标准化

  1. 如果数据存在异常值和较多噪音
  2. 在分类、聚类算法中,需要使用距离来度量相似性,比如SVM、LR、Knn、KMeans
  3. 使用PCA进行降维的时候,GBDT、 Adaboost

如果无从下手,可以直接标准化

3、不需要标准化的模型

1)模型算法里面没有关于对距离的衡量,没有关于对变量间标准差的衡量

2)概率模型(树形模型)不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF。

4、特殊说明

能不归一化最好不归一化,之所以进行数据归一化是因为各个维度的量纲不相同,而且需要看情况进行归一化。

有些模型在各维度进行了不均匀的伸缩之后,最优解与原来不等价(SVM)需要归一化。

有些模型伸缩与原来等价,如:LR则不用归一化,但是实际中往往通过迭代求解模型参数,如果目标函数太扁(想象一下很扁的高斯模型)迭代算法会发生不收敛的情况,所以最好进行数据归一化。

补充:其实本质是由于loss函数不同造成的,SVM用了欧拉距离,如果一个特征很大就会把其他的维度dominated。而LR可以通过权重调整使得损失函数不变。

5、逻辑回归必须要标准化吗

1)取决于我们的逻辑回归是不是用正则

  • 如果不用正则, 那么标准化不是必须的
  • 如果用正则,那么标准化是必须的

2)如果不用正则,那么标准化对逻辑回归有好处吗?

进行标准化后,我们得出的参数值的大小可以反应出不同特征对样本label的贡献度,方便我们进行特征筛选。如果不做标准化,是不能这样来筛选特征的。

3)做标准化有什么注意事项吗?

最大的注意事项就是先拆分出test集,只在训练集上标准化,即均值和标准差是从训练集中计算出来的,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中,造成了数据信息泄露,这是一个非常容易犯的错误。

三、实现

离散数据编码方式总结(OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies、DictVector

数据规范的几种方法,使用Python 的 sklearn 库均可实现

1、归一化

Min-max 规范化将原始数据变换到[0,1]或者[-1,1]的空间中

新数值 =(原数值 - 极小值)/(极大值 - 极小值)

# coding:utf-8
from sklearn import preprocessing
import numpy as np
# 初始化数据,每一行表示一个样本,每一列表示一个特征
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 将数据进行[0,1]规范化
min_max_scaler = preprocessing.MinMaxScaler()
minmax_x = min_max_scaler.fit_transform(x)
print minmax_x
运行结果:
[[0.         0.         0.66666667]
 [1.         1.         1.        ]
 [0.         1.         0.        ]]

2、标准化(Z-Score 规范化)

新数值 =(原数值 - 均值)/ 标准差

优点:算法简单,不受数据量级影响,结果易于比较。将数据转为正态分布。

缺点:需要数据整体的平均值和方差,而且结果没有实际意义,只是用于比较。

1)使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。

from sklearn import preprocessing
import numpy as np
# 初始化数据
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 将数据进行Z-Score规范化
scaled_x = preprocessing.scale(x)
print(scaled_x)
# 均值
print(scaled_x.mean(axiz=0))
# 方差
print(scaled_x.std(axiz=0))
运行结果:
[[-0.70710678 -1.41421356  0.26726124]
 [ 1.41421356  0.70710678  1.06904497]
 [-0.70710678  0.70710678 -1.33630621]]
# 均值
[0.00000000e+00, 0.00000000e+00, 1.48029737e-16]
# 方差
[1., 1., 1.]

2)使用sklearn.preprocessing.StandardScaler类

使用该类的好处在于可以保存训练集中的参数(均值、方差),可以直接使用训练集对测试集数据进行转换。

scaler = preprocessing.StandardScaler()
scaler_x = scaler.fit_transform(x)
# 直接对测试集数据进行转换
scaler_y = scaler.transform(y)

3、 小数定标规范化

通过移动小数点的位置来进行规范化,举个例子,比如属性 A 的取值范围是 -999 到 88,那么最大绝对值为 999,小数点就会移动 3 位,即新数值 = 原数值 /1000。那么 A 的取值范围就被规范化为 -0.999 到 0.088。

# coding:utf-8
from sklearn import preprocessing
import numpy as np
# 初始化数据
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 小数定标规范化
j = np.ceil(np.log10(np.max(abs(x))))
scaled_x = x/(10**j)
print scaled_x
运行结果:
[[ 0.  -0.3  0.1]
 [ 0.3  0.1  0.2]
 [ 0.   0.1 -0.1]]

​四、总结

归一化——能不归一化就不归一化

消除数值大小对结果的影响

把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权

优势:

对梯度下降的算法:加快收敛

对计算距离的算法:提高精度

标准化——更常用

消除数据分布对结果的影响

优势:

对有缺失值和异常值的样本友好

查看特征的贡献度(只对test数据集进行标准化)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值