Spark MLIB的Normalizer、StandardScaler、MinMaxScaler、RobustScaler这个特征处理方法有什么不同

目录

 

一、特征处理方法

二、啥是特征处理

三、Spark ML中常见算子释义

3.1 Normalizer

3.2 StandardScaler

3.3 MinMaxScaler

3.4 RobustScaler计算方法


一、特征处理方法

机器学习当中最重要的就是寻找数据的特征,给数据打标签。那么在SparkMLIB中提供了package org.apache.spark.ml.feature,包中封装了众多feature算子。今天剖析一下题目中的几个算子。

二、啥是特征处理

特征整体上就两类:一类是不可以用数字标识的特征:例如天气、喜好、心情、上下文等;另一类是可以用数值进行表述的特征,例如年龄、体温、价格等。那么特征处理又是个啥意思呢,通俗的说就有很多条数据,需要给这些数据对应的标识,当然如何标识的过程也是一个值得深入的问题。

下面可以画一个图来示意一下,啥是特征处理。

最后呢,根据特征列表梳理出来了小A的特征信息。

三、Spark ML中常见算子释义

3.1 Normalizer

Normalizer是SparkML中的正则函数。那么Normalizer描述的是向量在数域空间上的长度。

下面的式子,先计算出基本的向量范式。

\left \|x _{p} \right \|=\left ( {|x_{1}|}^{p}+{|x_{2}|}^{p}+... +{|x_{n}|}^{p}\right )^{\frac{1}{p}}

在此范式,求出向量的表达:

(x_{1},x_{2},x_{3},x_{4})_{p}=(\frac{x_{1}}{x_{p}},\frac{x_{2}}{x_{p}},\frac{x_{3}}{x_{p}},\frac{x_{4}}{x_{p}})

下面以向量组R为例进行编码,编码结果和源码都在下文。

\begin{vmatrix} 1.0&0.5 &-1.0 \\ 2.0&2.0 &1.0 \\ 4.0&10.0 &2.0 \end{vmatrix}

范式为1记为l1,后同;

l1:

l2:

l(无穷)

具体Spark源码实现如下:

package com.hammer.code
import org.apache.spark.ml.feature.Normalizer
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.DataFrame

import org.apache.spark.sql.SparkSession

object Normalizer {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("NormalizerExample")
      .master("local[2]")
      .getOrCreate()


    val dataFrame = spark.createDataFrame(Seq(
      (0, Vectors.dense(1.0, 0.5, -1.0)),
      (1, Vectors.dense(2.0, 1.0, 1.0)),
      (2, Vectors.dense(4.0, 10.0, 2.0))
    )).toDF("id", "features")

    // Normalize each Vector using $L^1$ norm.
    val normalizer = new Normalizer()
      .setInputCol("features")
      .setOutputCol("normFeatures")
      .setP(1.0)


    val l1NormData = normalizer.transform(dataFrame)
    println("Normalized using L^1 norm")
    l1NormData.show()

    val frame: DataFrame = normalizer.transform(dataFrame, normalizer.p -> 2.0)
    println("Normalized using l^2 norm")
    frame.show(false)
 
    val lInfNormData = normalizer.transform(dataFrame, normalizer.p -> Double.PositiveInfinity)
    println("Normalized using L^inf norm")
    lInfNormData.show()
    
    spark.stop()
  }

}

3.2 StandardScaler

作用:去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。最后呈现的效果就是数据方法是单位方差,均值是0。

Spark ML 代码如下:

object StandardScaler {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("StandardScalerExample")
      .master("local[2]")
      .getOrCreate()

    // $example on$
    val dataFrame = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")

    val scaler = new StandardScaler()
      .setInputCol("features")
      .setOutputCol("scaledFeatures")
      .setWithStd(true)
      .setWithMean(false)

    // Compute summary statistics by fitting the StandardScaler.
    val scalerModel = scaler.fit(dataFrame)

    // Normalize each feature to have unit standard deviation.
    val scaledData = scalerModel.transform(dataFrame)
    scaledData.show(false)
    // $example off$

    spark.stop()
  }
}

3.3 MinMaxScaler

转换公式如下:

Rescaled(e_i) = \frac{e_i - E_{min}}{E_{max} - E_{min}} * (max - min) + min

\(E_{max} == E_{min}\), \(Rescaled(e_i) = 0.5 * (max + min)\)

min:原有维度的最小值

max:原有维度的最大值

Spark ML 代码:

object MinMaxScalerExample {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("MinMaxScalerExample")
      .getOrCreate()

    // $example on$
    val dataFrame = spark.createDataFrame(Seq(
      (0, Vectors.dense(1.0, 0.1, -1.0)),
      (1, Vectors.dense(2.0, 1.1, 1.0)),
      (2, Vectors.dense(3.0, 10.1, 3.0))
    )).toDF("id", "features")

    val scaler = new MinMaxScaler()
      .setInputCol("features")
      .setOutputCol("scaledFeatures")

    // Compute summary statistics and generate MinMaxScalerModel
    val scalerModel = scaler.fit(dataFrame)

    // rescale each feature to range [min, max].
    val scaledData = scalerModel.transform(dataFrame)
    println(s"Features scaled to range: [${scaler.getMin}, ${scaler.getMax}]")
    scaledData.select("features", "scaledFeatures").show()
    // $example off$

    spark.stop()
  }
}

3.4 RobustScaler计算方法

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大锤爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值