zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Spark ML 正则化 标准化 归一化 ---- 基本概念简介

2023-04-18 12:53:30 时间

文章大纲

简介

正则化 (regularization)

正则化是为了防止过拟合, 正则化也可以叫做或者译成“规则项”,规则化就是说给需要训练的目标函数加上一些规则(限制),让他们不要自我膨胀。

python sklearn 版本:数据正则化Normalizer

from sklearn.preprocessing import Normalizer
def test_Normalizer():
    '''
    测试 Normalizer 的用法

    :return: None
    '''
    X=[   [1,2,3,4,5],
          [5,4,3,2,1],
          [1,3,5,2,4,],
          [2,4,1,3,5] ]
    print("before transform:",X)
    normalizer=Normalizer(norm='l2') # L2范式
    print("after transform:
",normalizer.transform(X))
test_Normalizer()
before transform: [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [1, 3, 5, 2, 4], [2, 4, 1, 3, 5]]
after transform:
 [[0.13483997 0.26967994 0.40451992 0.53935989 0.67419986]
 [0.67419986 0.53935989 0.40451992 0.26967994 0.13483997]
 [0.13483997 0.40451992 0.67419986 0.26967994 0.53935989]
 [0.26967994 0.53935989 0.13483997 0.40451992 0.67419986]]

知乎的一些回答:https://www.zhihu.com/question/20924039

标准化(standardization)

数据标准化是将数据按比例缩放,使其落入到一个小的区间内,标准化后的数据可正可负,但是一般绝对值不会太大,一般是z-score标准化方法:减去期望后除以标准差。

x^ast=frac{x-u}sigma

特点:

对不同特征维度的伸缩变换的目的是使其不同度量之间的特征具有可比性,同时不改变原始数据的分布。

好处:

  • 不改变原始数据的分布,保持各个特征维度对目标函数的影响权重
  • 对目标函数的影响体现在几何分布上
  • 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景

python sklearn 版本:数据标准化standardize

from sklearn.preprocessing import MinMaxScaler,MaxAbsScaler,StandardScaler

def test_MinMaxScaler():
    '''
    测试 MinMaxScaler 的用法

    :return: None
    '''
    X=[   [1,5,1,2,10],
      [2,6,3,2,7],
      [3,7,5,6,4,],
      [4,8,7,8,1] ]
    print("before transform:",X)
    scaler=MinMaxScaler(feature_range=(0,2))
    scaler.fit(X)
    print("min_ is :",scaler.min_)
    print("scale_ is :",scaler.scale_)
    print("data_max_ is :",scaler.data_max_)
    print("data_min_ is :",scaler.data_min_)
    print("data_range_ is :",scaler.data_range_)
    print("after transform:
",scaler.transform(X))
test_MinMaxScaler()
before transform: [[1, 5, 1, 2, 10], [2, 6, 3, 2, 7], [3, 7, 5, 6, 4], [4, 8, 7, 8, 1]]
min_ is : [-0.66666667 -3.33333333 -0.33333333 -0.66666667 -0.22222222]
scale_ is : [0.66666667 0.66666667 0.33333333 0.33333333 0.22222222]
data_max_ is : [ 4.  8.  7.  8. 10.]
data_min_ is : [1. 5. 1. 2. 1.]
data_range_ is : [3. 3. 6. 6. 9.]
after transform:
 [[0.         0.         0.         0.         2.        ]
 [0.66666667 0.66666667 0.66666667 0.         1.33333333]
 [1.33333333 1.33333333 1.33333333 1.33333333 0.66666667]
 [2.         2.         2.         2.         0.        ]]
def test_MaxAbsScaler():
    '''
    测试 MaxAbsScaler 的用法

    :return: None
    '''
    X=[   [1,5,1,2,10],
      [2,6,3,2,7],
      [3,7,5,6,4,],
      [4,8,7,8,1] ]
    print("before transform:",X)
    scaler=MaxAbsScaler()
    scaler.fit(X)
    print("scale_ is :",scaler.scale_)
    print("max_abs_ is :",scaler.max_abs_)
    print("after transform:
",scaler.transform(X))
test_MaxAbsScaler()
before transform: [[1, 5, 1, 2, 10], [2, 6, 3, 2, 7], [3, 7, 5, 6, 4], [4, 8, 7, 8, 1]]
scale_ is : [ 4.  8.  7.  8. 10.]
max_abs_ is : [ 4.  8.  7.  8. 10.]
after transform:
 [[0.25       0.625      0.14285714 0.25       1.        ]
 [0.5        0.75       0.42857143 0.25       0.7       ]
 [0.75       0.875      0.71428571 0.75       0.4       ]
 [1.         1.         1.         1.         0.1       ]]
def test_StandardScaler():
    '''
    测试 StandardScaler 的用法

    :return: None
    '''
    X=[   [1,5,1,2,10],
      [2,6,3,2,7],
      [3,7,5,6,4,],
      [4,8,7,8,1] ]
    print("before transform:",X)
    scaler=StandardScaler()
    scaler.fit(X)
    print("scale_ is :",scaler.scale_)
    print("mean_ is :",scaler.mean_)
    print("var_ is :",scaler.var_)
    print("after transform:
",scaler.transform(X))
test_StandardScaler()
before transform: [[1, 5, 1, 2, 10], [2, 6, 3, 2, 7], [3, 7, 5, 6, 4], [4, 8, 7, 8, 1]]
scale_ is : [1.11803399 1.11803399 2.23606798 2.59807621 3.35410197]
mean_ is : [2.5 6.5 4.  4.5 5.5]
var_ is : [ 1.25  1.25  5.    6.75 11.25]
after transform:
 [[-1.34164079 -1.34164079 -1.34164079 -0.96225045  1.34164079]
 [-0.4472136  -0.4472136  -0.4472136  -0.96225045  0.4472136 ]
 [ 0.4472136   0.4472136   0.4472136   0.57735027 -0.4472136 ]
 [ 1.34164079  1.34164079  1.34164079  1.34715063 -1.34164079]]

归一化 (Normalization)

归一化 (Resaling) 一般是将数据映射到指定的范围,用于去除不同维度放入量纲以及量纲单位。常见的映射范围有 [ 0, -1 ] 和 [ -1, 1],最常见的归一化方法就是 Min-Max 归一化

把数值放缩到0到1的小区间中(归到数字信号处理范畴之内),一般方法是最小最大规范的方法:min-max normalization

x^ast=frac{x-min}{max-min}

上面min-max normalization是线性归一化,还有非线性归一化,通过一些数学函数,将原始值进行映射。该方法包括log、指数、反正切等。需要根据数据分布的情况,决定非线性函数的曲线。

区别与 使用场景

1、在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,标准化(Z-score standardization)表现更好。

2、在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

哪些模型必须归一化/标准化?

(1)SVM   不同的模型对特征的分布假设是不一样的。比如SVM 用高斯核的时候,所有维度共用一个方差,这不就假设特征分布是圆的么,输入椭圆的就坑了人家,所以简单的归一化都还不够好,来杯白化才有劲。比如用树的时候就是各个维度各算各的切分点,没所谓。

(2)KNN   需要度量距离的模型,一般在特征值差距较大时,都会进行归一化/标准化。不然会出现“大数吃小数”。

(3)神经网络   1)数值问题   归一化/标准化可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题吧,但其实要引起也并不是那么困难。因为tansig(tanh)的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。   假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,例如0.00243,那么,在matlab里输入 421·0.00243 == 0.421·2.43,会发现不相等,这就是一个数值问题。

2)求解需要   a. 初始化:在初始化时我们希望每个神经元初始化成有效的状态,tansig函数在[-1.7, 1.7]范围内有较好的非线性,所以我们希望函数的输入和神经元的初始化都能在合理的范围内使得每个神经元在初始时是有效的。(如果权值初始化在[-1,1]且输入没有归一化且过大,会使得神经元饱和)   b. 梯度:以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2ew(1-a^2)*x的形式(e是誤差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。   c. 学习率:由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 隐层到输出层的权值梯度可以写成 2ea,而输入层到隐层的权值梯度为 2ew(1-a^2)x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。   d.搜索轨迹:已解释 (4)PCA

参考文献

系列文章:

spark 中的 特征相关内容处理的文档

  • http://spark.apache.org/docs/latest/api/scala/org/apache/spark/ml/feature/index.html

概念简介

  • https://blog.csdn.net/u014381464/article/details/81101551

参考:

  • https://segmentfault.com/a/1190000014042959
  • https://www.cnblogs.com/nucdy/p/7994542.html
  • https://blog.csdn.net/weixin_34117522/article/details/88875270
  • https://blog.csdn.net/xuejianbest/article/details/85779029