相关文章推荐
坚强的啄木鸟  ·  什么是联机事务处理(OLTP)? | ...·  9 月前    · 
坚强的啄木鸟  ·  数据处理方法归纳- 数之美- 博客园·  9 月前    · 
坚强的啄木鸟  ·  数据处理的基本方法--简要介绍_数据处理的方 ...·  9 月前    · 
坚强的啄木鸟  ·  GDPR合规|数据控制者与数据处理者区别大吗 ...·  9 月前    · 
坚强的啄木鸟  ·  关于汽车数据处理4项安全要求检测情况的通报( ...·  9 月前    · 
小百科  ›  数据处理中的标准化、归一化,究竟是什么?开发者社区
数据处理 数据标准化 大数据 数据处理 归一化
听话的牛肉面
2 年前
作者头像
小一不二三
0 篇文章

数据处理中的标准化、归一化,究竟是什么?

原创
前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 小一的学习笔记 > 数据处理中的标准化、归一化,究竟是什么?

数据处理中的标准化、归一化,究竟是什么?

原创
作者头像
小一不二三
修改 于 2021-02-18 17:34:42
2.6K 0
修改 于 2021-02-18 17:34:42
举报

原文链接: 数据处理中的标准化、归一化,究竟是什么?

大家好,我是小一

今天说一个比较重要的内容,无论是在算法建模还是在数据分析都比较常见:数据归一化和标准化。

开始之前, 请你先把网上看到的所有相关的博客、帖子都忘掉。不说全部,能讲清楚这个概念的文章真寥寥无几 ,首先是中英文名称翻译的问题,其次是概念理解的不全面,也就造成了网上的说法不一,看了之后各种被误导。

当然,如果你在阅读文章的时候,发现存在问题欢迎留言批评指正

【但是我觉得你可能没有批评指正的机会!】

先来说下概念

数据归一化和标准化都属于数据特征无量纲的一种方式。无量纲指的是将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,称之为数据“无量纲化”。

在模型训练过程中,经过无量纲化之后的数据特征对于模型的求解有加速作用,特别是对于需要计算梯度和矩阵的模型(例如逻辑回归中通过梯度下降求解损失函数)。

另外,在k近邻、聚类等算法中需要计算距离,使用无量纲化可以提升模型精度,避免异常值对整体的计算造成影响,这个在后面会细说。

数据的无量纲化可以是线性的,也可以是非线性的。非线性的无量纲不太常用,例如百分位数转换、应用特征功率转换等,基本很少用到;而常用的线性无量纲化主要包括 中心化处理和缩放处理 ,在特征工程中比较常见。

中心化的本质是 让所有记录减去一个固定值,即让数据样本平移到某个位置 。

缩放的本质是 通过除以一个固定值,将数据固定在某个范围之中 。

下面来细说

数据归一化

【重要!!】 数据归一化的英文翻译有两种:Normalization 和 Min-Max Scaling。

数据归一化是当数据 x 按照最小值中心化后,再按极差(最大值-最小值)进行缩放。最终的数据移动了最小值个单位,并且会被收敛到【0,1】之间。

归一化的公式如下:

$$

x^* = \frac{x-min(x)}{max(x)-min(x)}

$$

这里一定要注意的是:Normalization 是归一化的意思,并不是正则化,而正则化的英文翻译应该是:Regularization,但是正则化并不是数据处理的一种手段。

代码实现

常用的特征无量纲化方法都已经在 sklearn 中实现,可以直接调用,一般都是在基于 sklearn 下的 preprocessing 模块。

归一化的实现可以调用 MinMaxScaler 函数,当然你也可以自己实现,公式也都在上面列出来了。

MinMaxScaler 有一个重要参数:feature_range,默认值 0,1 表示将数据收敛到 0,1 之间。

MinMaxScaler 可以手动设置,但是一般情况都是选择默认值

具体的,进行特征归一化的代码实现如下:

import numpy as np
from sklearn.preprocessing import MinMaxScaler
# 创建数组
data_rn = np.random.randint(-10, 10, 10).reshape(5, 2)
print(data_rn)
# 进行标准归一化
scaler_mms = MinMaxScaler()
result_mms = scaler_mms.fit_transform(data_rn)
print(result_mms)
# 手动设置收敛区间[1,3]
scaler_mms_parm = MinMaxScaler(feature_range=(1, 3))
result_mms_parm = scaler_mms_parm.fit_transform(data_rn)
print(result_mms_parm)
"""输出"""
[[-10   7]
 [  1   9]
 [ -3  -5]
 [ -9  -6]
 [ -8   5]]
[[0.         0.86666667]
 [1.         1.        ]
 [0.63636364 0.06666667]
 [0.09090909 0.        ]
 [0.18181818 0.73333333]]
[[1.         2.73333333]
 [3.         3.        ]
 [2.27272727 1.13333333]
 [1.18181818 1.        ]
 [1.36363636 2.46666667]]

可以看到,手动设置的收敛范围其实就是在 0,1 的基础上进行了相应的平移和缩放。

就比如上面手动设置的 1,3 就是在 0,1 的基础上先缩放 2 变成 0,2 再平移 1 变成 1,3。

所以,要想归一化的结果收敛至任意一组值 a,b 之间,则归一化的公式变成:

$$

x^ = a + \frac{x-min(x) (b-a)}{max(x)-min(x)}

$$

对应的,在 MinMaxScaler 函数调用中只需要设置 feature_range 的取值为 (a,b) 即可。

数据标准化

数据标准化的英文翻译:Standardization,又称 Z-score normalization。

数据标准化是指当数据 x 按均值 μ 中心化后,再按标准差 σ 缩放,数据就会服从均值为 0,方差为 1 的标准正态分布,这个过程就叫做数据标准化。

数据标准化的公式如下:

$$

x^* = \frac{x-\mu}{\sigma}

$$

有一点需要注意:标准化并不会改变数据的分布 。之所以会说标准化之后数据变成标准正态分布,是因为原始的数据就是符合正态分布的,只不过并不是标准正态分布。

另外大家会把标准化和正态分布联系起来,是因为实际中大多数数据都是正态分布的,或者近似正态分布。所以在标准化之后数据就会变成标准正态分布。

不是说原本未知分布在标准化之后就可以凭空变成正态分布的。

代码实现

具体的,进行特征标准化的代码实现如下:

import numpy as np
from sklearn.preprocessing import StandardScaler
# 创建数组
data_rn = np.random.randint(-10, 10, 10).reshape(5, 2)
# 进行标准化
print(data_rn)
scaler_ss = StandardScaler()
result_ss = scaler_ss.fit_transform(data_rn)
print(result_ss)
"""输出"""
[[-10   7]
 [  1   9]
 [ -3  -5]
 [ -9  -6]
 [ -8   5]]
[[-1.00803226  0.79859571]
 [ 1.63205223  1.11803399]
 
推荐文章
坚强的啄木鸟  ·  什么是联机事务处理(OLTP)? | Oracle 中国
9 月前
坚强的啄木鸟  ·  数据处理方法归纳- 数之美- 博客园
9 月前
坚强的啄木鸟  ·  数据处理的基本方法--简要介绍_数据处理的方法-CSDN博客
9 月前
坚强的啄木鸟  ·  GDPR合规|数据控制者与数据处理者区别大吗?分别承担什么法律 ...
9 月前
坚强的啄木鸟  ·  关于汽车数据处理4项安全要求检测情况的通报(第一批)
9 月前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南