Spark MLlib中几种常见的数据标准化方法

本文重点介绍了五种数据标准化方法,并且利用Spark MLlib进行代码实现。

1.Normalizer

  • Nomalizer是PySpark MLlib库中的一个特征转换器,用于对向量进行归一化(标准化)处理,使其具有单位范数(unit norm)。以下是详细解释:

  • 公式:将输入向量的每个元素除以该向量的 p-范数(p-norm)

$$
归一化后的向量=\frac{原向量}{\Vert原向量\Vert_p}, 其中\Vert \Vert_p表示p范数。
$$

  • 常见范数类型
  1. L1 范数(p=1):向量各元素绝对值的和
  2. L2 范数(p=2):向量的欧几里得长度
  3. 无穷范数(p=无穷):取向量元素的最大绝对值

2. StandardScaler

  • StandardScaler是PySpark MLlib库中用于特征标准化的核心转换器,它通过将特征进行缩放,使其均值为 0,标准差为 1。这种标准化处理也称为 Z-score 标准化。

3. RobustScaler

  • RobustScaler 用于对数据集中的向量进行转换,移除中位数并按照指定的分位数范围(默认使用 IQR,即四分位距,第1四分位数到第3四分位数之间的范围)缩放数据。其行为与 StandardScaler类似,但使用中位数和分位数范围替代均值和标准差,因此对异常值具有鲁棒性。

4. MinMaxScaler

  • MinMaxScaler 用于将数据线性缩放到指定范围,如[0, 1]。

  • 具体公式为:
    $$
    放缩后的数据 = \frac{原数据 - 数据最小值}{数据最大值 - 数据最小值} \times (max - min) + min
    $$

  • 注:若所有值都相同,所有值都变成0.5*(min+max)

5. MaxAbsScaler

  • MaxAbsScaler原理是通过将每个特征除以该特征的最大绝对值,从而将各特征重新缩放到[-1, 1]的范围内。该缩放器不会对数据进行位移或中心化处理,因此可以完全保留数据的稀疏性。

代码实现

1.VectorAssembler

class pyspark.ml.feature.VectorAssembler( inputCols = None, outputCol = None, handleInvalid = ‘error’)

  1. inputCols:输入列名

  2. outputCol:输出列名

  3. handleInvalid:处理无效值的策略,可选:

    • 'error' (默认): 抛出异常
    • 'skip': 跳过包含无效值的行
    • 'keep': 保留无效值(在结果向量中保留NaN)
  • 是一种transformer,将指定列组合成单个向量列的转换器,能够将原始特征与不同特征转换器生成的特征合并为统一的特征向量,适用于逻辑回归、决策树等机器学习模型的训练需求。VectorAssembler支持以下输入列类型:所有数值类型、布尔类型以及向量类型。

Refer to the VectorAssembler Python docs for more details on the API.

2. Normalizer

class pyspark.ml.feature.Normalizer( p = 2.0, inputCol = None, outputCol = None)

  1. inputCols:输入列名

  2. outputCol:输出列名

  3. p:范数的幂次(p=1为L1范数,p=2为L2范数, p=float(“inf”)为无穷范数)

  • 是一种transformer,将向量按给定的 p-范数归一化为单位范数。

Refer to the Normalizer Python docs for more details on the API.

3. StandardScaler

class pyspark.ml.feature.StandardScaler( withMean = False, withStd = True, inputCol = None, outputCol = None)

  1. inputCol:输入列名

  2. outputCol:输出列名

  3. withStd:默认为True。将数据按单位标准差进行缩放。

  4. withMean:默认为False。在缩放前用均值对数据进行中心化处理。此操作会生成密集输出,因此处理稀疏输入时需谨慎。

  • 是一种 Estimator,进行Z-score 标准化。
  • model.mean #获取均值
  • model.std #获取标准差

Refer to the StandardScaler Python docs for more details on the API.

4. RobustScaler

class pyspark.ml.feature.RobustScaler( lower = 0.25, upper = 0.75, withCentering = False, withScaling = True, inputCol = None, outputCol = None, relativeError = 0.001)

  1. inputCol:输入列名

  2. outputCol:输出列名

  3. withCentering:默认为False。是否用中位数中心化(减去中位数)

  4. withScaling:默认为True。是否按分位数范围缩放(默认IQR缩放)

  5. lower:计算分位数范围的下界

  6. upper:计算分位数范围的上界

  7. relativeError :分位数计算的允许误差

  • 是一种 Estimator,通过移除中位数并基于分位数范围缩放数据。
  • model.median #获取中位数
  • model.range #获取IQR

Refer to the RobustScaler Python docs for more details on the API.

5. MinMaxScaler

class pyspark.ml.feature.MinMaxScaler(min = 0.0, max = 1.0, inputCol = None, outputCol = None)

  1. inputCol:输入列名

  2. outputCol:输出列名

  3. min:默认为最小值,

  4. max:默认为最大值,

  • 是一种 Estimator,将每个特征的数值线性缩放到指定范围 [min, max](默认为[0, 1]),也称为最小-最大归一化。

Refer to the MinMaxScaler Python docs for more details on the API.

6. MaxAbsScaler

  • class pyspark.ml.feature.MaxAbsScaler(inputCol = None, outputCol = None)
  1. inputCol:输入列名

  2. outputCol:输出列名

  • 是一种 Estimator,将每个特征独立地重新缩放至 [-1, 1] 的范围内,具体方法是用该特征的最大绝对值进行除法运算。

Refer to the MaxAbsScaler Python docs for more details on the API.