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

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

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

目录

一、介绍

二、为什么要规范化?

三、如何选择

1、归一化

2、标准化

3、不需要标准化的模型

4、特殊说明

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

三、实现

1、归一化

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

[3、 小数定标规范化](#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]的空间中

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

python 复制代码
# 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
python 复制代码
运行结果:
[[0.         0.         0.66666667]
 [1.         1.         1.        ]
 [0.         1.         0.        ]]

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

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

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

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

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

python 复制代码
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))
python 复制代码
运行结果:
[[-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类

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

python 复制代码
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。

python 复制代码
# 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
python 复制代码
运行结果:
[[ 0.  -0.3  0.1]
 [ 0.3  0.1  0.2]
 [ 0.   0.1 -0.1]]

​四、总结

归一化------能不归一化就不归一化

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

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

优势:

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

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

标准化------更常用

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

优势:

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

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

相关推荐
网络研究院38 分钟前
如何安全地大规模部署 GenAI 应用程序
网络·人工智能·安全·ai·部署·观点
凭栏落花侧42 分钟前
决策树:简单易懂的预测模型
人工智能·算法·决策树·机器学习·信息可视化·数据挖掘·数据分析
吱吱鼠叔3 小时前
MATLAB计算与建模常见函数:5.曲线拟合
算法·机器学习·matlab
xiandong204 小时前
240929-CGAN条件生成对抗网络
图像处理·人工智能·深度学习·神经网络·生成对抗网络·计算机视觉
innutritious5 小时前
车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27
人工智能·深度学习·计算机视觉
醒了就刷牙5 小时前
56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版
pytorch·深度学习·gru
橙子小哥的代码世界5 小时前
【深度学习】05-RNN循环神经网络-02- RNN循环神经网络的发展历史与演化趋势/LSTM/GRU/Transformer
人工智能·pytorch·rnn·深度学习·神经网络·lstm·transformer
985小水博一枚呀7 小时前
【深度学习基础模型】神经图灵机(Neural Turing Machines, NTM)详细理解并附实现代码。
人工智能·python·rnn·深度学习·lstm·ntm
SEU-WYL8 小时前
基于深度学习的任务序列中的快速适应
人工智能·深度学习
OCR_wintone4218 小时前
中安未来 OCR—— 开启高效驾驶证识别新时代
人工智能·汽车·ocr