特征处理-归一化(等比例缩放数字)

概述

归一化,Normalization

  1. 把数据进行变换,映射到 [0,1] 之间
    主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加 便捷快速

  2. 有量纲 表达式变成 无量纲 表达式,便于 不同单位量级 的指标能够进行 比较加权
    归一化是一种 简化计算 的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。

扩展

把数据进行变换,映射 [m,n] 之间

案例

假设女生找男朋友的标准有 4个特征:颜值、身高、年薪、房子面积,而且认为 这4个特征 同等重要

目标值 是女生对该男生的 评价:不喜欢、一般、喜欢

颜值(分) 身高(cm) 年薪(元) 房子面积(平方米) 评价
7 180 300000 70 喜欢
3 172 200000 110 不喜欢
5 168 250000 190 一般
8 185 60000 0 一般
4 178 36000 80 喜欢
6 175 48000 120 喜欢

注意:特征同等重要 时,才 有可能 需要做归一化处理

在做 分类预测 时,有的分类算法(KNN)要计算特征之间的距离, 计算方式如下:

  1. (列0最大值 - 0最小值)^2+(列1最大值 - 1最小值)^2+...+(列n最大值-列n最小值)^2

计算如下:

  1. (7-3)^2+(185-168)^2+(300000-36000)^2+(190-0)^2

问题

  1. 颜值 数值较小,差异过小,所以 颜值 影响 过小,可以忽略。
  2. 身高 数值过小,差异过小,所以 身高 影响 过小,可以忽略。
  3. 年薪 数值过大,差异过大 ,所以 年薪 影响 过大
  4. 房子面积 数值较小,差异较小,所以 房子面积 影响 较小

在计算时,就 违背特征同等重要

归一化 解决

分别对“颜值”、“身高”、“年薪”、“房子面积” 4个特征 做归一化,转换成 无量纲的数值

注意: 不是 整体 做归一化,是分别对 4个特征 做归一化

如下:

颜值 身高 年薪 房子面积
0.8 0.70588235 1. 0.36842105
0. 0.23529412 0.62121212 0.57894737
0.4 0. 0.81060606 1.
1. 1. 0.09090909 0.
0.2 0.58823529 0. 0.42105263
0.6 0.41176471 0.04545455 0.63157895

以前2行的“颜值”、“年薪”为例

  • 转换前,“年薪”量纲更大,显得更重要
  • 归一化后,特征转成[0,1]的无量纲数值,同等重要

为什么要归一化?

让数据同等重要

  • 由于数据的 单位不一样,有些数据的范围较大,对结果的影响较大;有些数据的范围较小,对结果的影响较小,不符合数据同等重要

  • 由于有些数据的 值范围较大对结果的影响较大;有些数据的 值范围较小对结果的影响较小,不符合数据同等重要

所以,为了让 特征同等重要 ,就需要做 归一化,让每个特征的数据,映射在[0,1]之间,这样对结果的 影响一样大

与激活函数有关

以 sigmoid激活函数为例 ,参见
https://www.malaoshi.top/show_1EF3rzCm0GFL.html

当输入数据过大、过小时,得到的结果差别不大,不能很好的做激活处理

好处

  1. 加快了 梯度下降 求最优解的速度
    加速梯度下降,减少梯度下降时的 摆动

  2. 有可能提高 精度
    每个特征同等重要

缺点

当有 异常数据 时,计算后对 结果 影响较大,鲁棒性较差,如下图:

应用场景

在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用

比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围

不包括Z-score方法

归一化的类型

本文主要讲解 线性归一化

1. 线性归一化

比较适用在 数值 比较 集中 的情况。

缺陷:如果 max(最大值)和 min(最小值)不稳定,很容易使得归一化 结果不稳定,使得后续使用 效果也不稳定

2. 非线性归一化

比较适用在 数据 分化 比较大 的情况,有些数值 很大,有些 很小
通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。

Min-Max归一化(线性归一化)

解释:

  • 作用于每一个特征
  • max(x) 为 该特征 的 最大值
  • min(x) 为 该特征 的 最小值
  • 结果在 [0,1] 之间

numpy实现归一化:

  1. import numpy as np
  2. # 将上面的案例进行归一化
  3. l=[
  4. [7,180,300000,70],
  5. [3,172,200000,110],
  6. [5,168,250000,190],
  7. [8,185,60000,0],
  8. [4,178,36000,80],
  9. [6,175,48000,120]
  10. ]
  11. arr=np.array(l)
  12. def max_min_normal(x):
  13. mn=np.min(x,axis=0)
  14. mx=np.max(x,axis=0)
  15. return (x-mn)/(mx-mn)

sklearn实现归一化

  1. from sklearn import preprocessing
  2. import numpy as np
  3. l=[
  4. [7,180,300000,70],
  5. [3,172,200000,110],
  6. [5,168,250000,190],
  7. [8,185,60000,0],
  8. [4,178,36000,80],
  9. [6,175,48000,120]
  10. ]
  11. arr=np.array(l)
  12. ret = preprocessing.MinMaxScaler().fit_transform(arr)
  13. print("归一化:\n",ret)

缩放数字

将图片的值缩放到0-255之间

有时归一化后,可以自定义结果的区间,还需要再次计算,公式如下:

解释:

  • x'是 线性归一化 公式的计算结果
  • mx、mi是指定区间的最大值、最小值
  • 结果x''在[mi,mx]之间

在卷积网络中,一般将图片进行归一化,处理后,需要将值缩放回0-255之间,才能显示成图片。

根据上面 【扩展】 得出:

  1. def max_min_normal(x):
  2. mn=np.min(x)
  3. mx=np.max(x)
  4. return (x-mn)/(mx-mn)*255

将值缩放到指定区间

使用下面函数:

  1. import numpy as np
  2. def max_min_normal(x,min,max):
  3. mn=np.min(x)
  4. mx=np.max(x)
  5. res = (x-mn)/(mx-mn)
  6. return res * (max-min)+min

形参解释:

  • x 表示要计算的数据
  • max 表示指定范围的最大值
  • min 表示指定范围的最小值

测试:

  1. x = [98,97,92,85,81,73,60]
  2. res = max_min_normal(x,85,95)
  3. print("res:",res)

执行结果:

  1. [95. 94.73684211 93.42105263 91.57894737 90.52631579 88.42105263
  2. 85. ]

Z-score标准化(0均值归一化)

这种方式是标准化,转换后没有把数据映射到[0,1]之间,但有的地方也将其归为归一化

参见:
https://www.malaoshi.top/show_1EF4YYUNDlOv.html

参考:
https://www.jianshu.com/p/95a8f035c86c
https://blog.csdn.net/qq_36523839/article/details/82919412
https://blog.csdn.net/Datapad/article/details/80174775
https://blog.csdn.net/qq_24831889/article/details/83344638
https://blog.csdn.net/zs15321583801/article/details/79663654


原文出处:http://malaoshi.top/show_1EF44SFFqg9G.html