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

2023-11-14

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


大家好,我是小一

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

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

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

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


先来说下概念

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

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

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


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

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

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

下面来细说



数据归一化

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

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

归一化的公式如下:
x ∗ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^* = \frac{x-min(x)}{max(x)-min(x)} x=max(x)min(x)xmin(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 + [ x − m i n ( x ) ] ∗ ( b − a ) m a x ( x ) − m i n ( x ) x^* = a + \frac{[x-min(x)]*(b-a)}{max(x)-min(x)} x=a+max(x)min(x)[xmin(x)](ba)
对应的,在 MinMaxScaler 函数调用中只需要设置 feature_range 的取值为 (a,b) 即可。



数据标准化

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

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

数据标准化的公式如下:
x ∗ = x − μ σ x^* = \frac{x-\mu}{\sigma} x=σxμ
有一点需要注意:标准化并不会改变数据的分布。之所以会说标准化之后数据变成标准正态分布,是因为原始的数据就是符合正态分布的,只不过并不是标准正态分布。

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

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


代码实现

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

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]
 [ 0.67202151 -1.11803399]
 [-0.76802458 -1.27775313]
 [-0.5280169   0.47915742]]

另外,也可以通过 inverse_transform 函数将标准化后的数据进行逆转

# 标准化后的数据逆转
data_inverse = scaler_ss.inverse_transform(result_ss)

对于 StandardScaler 和 MinMaxScaler 来说,空值 NAN 会被当作是缺失值,在 fit_transform 的时候继续保持缺失状态。



标准化和归一化的区别与联系?

首先,需要明确很重要的一点:归一化和标准化都不会改变数据的分布。

它们都是对于数据的线性无量纲化,通过相应的缩放和平移使得数据发生改变的过程,但是并没有改变原始数据的排列顺序。


其中归一化 Normalization 会严格的限定数据变化后的范围,默认的是将数据控制在 [0,1] 之间。

而标准化 Standardization 之后的数据没有严格的区间,变化之后的数据没有范围,只是数据整体的均值为 0,标准差为 1

另外,归一化缩放的比例仅仅和极值有关,而标准化缩放的比例和整体数据集有关。所以对于存在异常数据的样本来说,用归一化并不是一个聪明的决定

比如有一批样本取值是 0~10,突然加入异常值 99 再进行归一化之后,正确样本的数值将会变得很小,这个时候,使用标准化的效果会优于归一化。



数据处理的时候选哪个?

只能说,针对情况选择。

在大多数机器学习算法中,因为 MinMaxScaler 对异常值的敏感,所以都会选择 StandardScaler 进行特征缩放。例如聚类、逻辑回归、支持向量机、PCA 等算法。

但是如果在缩放的时候不涉及距离、梯度等的计算,并且对数据的范围有严格要求,就可以使用归一化进行缩放。

并不是所有模型的数据都需要标准化和归一化的。

类似决策树模型,在节点分裂的时候计算的是信息增益,标准化后并不能大幅提高模型的计算速度【可能会有很小的提升】

类似概率模型,并不关心变量的值,只关心变量的分布和变量之间的条件概率。


综上,一般在特征无量纲化的时候,如果没有硬性规定【缩放范围、距离计算等】,可以先使用标准化,效果不好再试试归一化。


我是小一,坚持向暮光所走的人,终将成为耀眼的存在。

期待你的三连,我们下节见。



作者:xiaoyi

文章首发:公众号【小一的学习笔记】

未经允许禁止转载,需要转载请微信联系授权(微信号:zhiqiuxiaoyi)

原文链接:数据处理中的标准化、归一化,究竟是什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 第十届蓝桥杯省赛C++B组 完全二叉树的权值

    试题 G 完全二叉树的权值 时间限制 1 0s 内存限制 256 0MB 本题总分 20 分 问题描述 给定一棵包含 N 个节点的完全二叉树 树上每个节点都有一个权值 按从上到下 从左到右的顺序依次是 A1 A2 AN 如下图所示 现在小明
  • 机器学习好伙伴之scikit-learn的使用——学习曲线

    机器学习好伙伴之scikit learn的使用 学习曲线 什么是学习曲线 sklearn中学习曲线的实现 应用示例 什么是学习曲线呢 其内容主要包含当训练量增加时 loss的变化情况 什么是学习曲线 学习曲线主要反应的是学习的一个过程 常用
  • 求过审~~~

    我要过审 纯水
  • 微信小程序openid取不到,总是undefined

    今天在做微信小程序开发的时候 遇到了这样的问题 微信小程序官网的坑是少了data 所以获取不到 是undefined 但我加了data还是undefined 解决方法是 遍历res data这个对象数组 看回送的错误码及错误是什么 我的错误
  • C++成员函数模板特化问题

    C 成员函数模板特化问题 1 类似代码写法 include
  • Java中的常量池

    一 在Java中有那些常量池 谈到常量池 在Java体系中 共用四种常量池 分别是字符串常量池 Class常量池和运行时常量池 JAVA 基本类型的封装类及对应常量池 二 字符串常量池 在JVM中 为了减少相同的字符串的重复创建 为了达到节
  • 手写python实现梯度下降算法(base问题:多元线性回归)

    手写python实现梯度下降算法 因为课程设计的原因 接触了很多和机器学习相关的事情 在学习的时候发现 机器学习如果只是听不写代码基本什么都学习不到 于是自己利用python手写了大部分的常见的基础的算法 很有趣呢 慢慢更新咯 文章目录 手
  • c语言中y=0x20什么意思,ASCII码0x20之前的码分别是什么意义?

    ASCII码0x20之前的码分别是什么意义 ascii码0x20之前的码分别是什么意义 c 语言 ascii码表中的前32个都是些控制字符 nul 0 0000 0x00 sp 32 0040 0x20 64 0100 0x40 96 01
  • 05 Django工程创建、注册子应用及ORM模型

    一 创建django工程 1 创建 cd Desktop test django admin startproject name 例如 django admin startproject testmanager cd testmanager
  • java并发包:生产者消费者模式

    本文转载至 http blog csdn net a910626 article details 51900974 生产者消费者模式是一个经典的多线程设计模式 它为多线程间的协作提供了良好的解决方案 在生产者消费者模式中 通常有两类线程 即
  • Learn_C++单词

    nomenclature Deprecated cubbyholes render inadvertently polygons truncation decrement ballistic refutation exotic oversi
  • linux网络编程一:epoll

    简介 一提到linux高性能服务器编程 epoll就是绕不开的话题 当前网络库在linux上实现也主要是以epoll为主 epoll的主要优点有 当检查大量的文件描述符时 epoll的性能比select和poll要高很多 epoll 既支持
  • mongoTemplate操作MongoDB排序

    解决项目中遇到的排序问题 Mark一下 Override public List
  • 【定时将hbase的索引同步到solr的core,当同步失败时,回滚core】好记性不如烂笔头,我将工作中写的自动化脚本记录在此,供大家参考

    前言 此脚本不包含core的创建 创建core请移步他处 本贴侧重core快照的创建 快照状态查询 core的删除 从快照恢复core hbase到solr的同步不做为本贴的重点 同步脚本syn solr sh内容 binbash 定义co
  • 虚拟机使用教程

    文章目录 前言 1 什么是母机与子机 2 常用快捷键 一 如何开机 二 如何克隆及删除虚拟机 三 如何修改硬件信息 改机器码 四 虚拟机内外如何传文件 五 调整虚拟机窗口大小及虚拟机全屏显示 六 如何调整cpu 内存 七 虚拟机开启声音 不
  • latex 约等于且大于 小于

    约等于 a approx b gt approx 大于约等于 a gtrsim b gt gtrsim 小于约等于 a
  • 基于QT 实现的LearnGL例子

    LOpenGL 是学习OpenGL非常好的资料 网址是 LearnOpenGL CN learnopengl cn github io 最近复习OpenGL 基于QT 拷贝实现了LearnGL的一些例子 下载地址 QT OpenGL 学习基
  • UML_类图

    在UML类图中 常见的有以下几种关系 泛化 Generalization 实现 Realization 关联 Association 聚合 Aggregation 组合 Composition 依赖 Dependency 1 泛化 Gene
  • 【Python】python 3.x 数据类型 吐血汇总

    文章目录 1 整数型 2 浮点数 3 字符串 4 布尔值 5 空值 6 变量 7 定义字符串 1 raw字符串 多行字符串 2 Unicode字符串 8 集合 list 1 访问列表中的值 2 更新列表 3 删除列表元素 4 Python列
  • 数据处理中的标准化、归一化,究竟是什么?

    原文链接 数据处理中的标准化 归一化 究竟是什么 大家好 我是小一 今天说一个比较重要的内容 无论是在算法建模还是在数据分析都比较常见 数据归一化和标准化 开始之前 请你先把网上看到的所有相关的博客 帖子都忘掉 不说全部 能讲清楚这个概念的