Spark StandardScaler 特征标准化

1、概念

zscore规范化,又叫零均值规范化 
将某个特征向量(由所有样本某一个特征组成的向量)进行标准化,使数据均值为0,方差为1。Spark中可以选择是带或者不带均值和方差。

StandardScaler转换Vector行的数据集,将每个要素归一化以具有单位标准差(和/或)零均值。它带有参数: withStd:默认为True。将数据缩放到单位标准偏差,将方差缩放到1。 withMean:默认为False。在缩放之前,将数据以均值居中。它将生成密集的输出,因此在应用于稀疏输入时要小心。
将均值移到0,注意对于稀疏输入矩阵不可以用。默认为false StandardScaler是一个Estimator,可以适合数据集以生成StandardScalerModel。这相当于计算摘要统计信息。然后,该模型可以将数据集中的Vector列转换为具有单位标准差和/或零均值特征。 请注意,如果要素的标准偏差为零,它将在向量中返回该要素的默认0.0值。
对于同一个特征,不同的样本中的取值可能会相差非常大,一些异常小或异常大的数据会误导模型的正确训练;另外,如果数据的分布很分散也会影响训练结果。以上两种方式都体现在方差会非常大。
此时,我们可以将特征中的值进行标准差标准化,即转换为均值为0,方差为1的正态分布。如果特征非常稀疏,并且有大量的0(现实应用中很多特征都具有这个特点),Z-score 标准化的过程几乎就是一个除0的过程,结果不可预料。
所以在训练模型之前,一定要对特征的数据分布进行探索,并考虑是否有必要将数据进行标准化。基于特征值的均值(mean)和标准差(standard deviation)进行数据的标准化。
它的计算公式为:标准化数据=(原数据-均值)/标准差。标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

2、code

package com.home.spark.ml

import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.StandardScaler
import org.apache.spark.sql.SparkSession

/**
  * @Description: 通过删除平均值并使用列摘要对训练集中的样本进行统计,将其缩放为单位方差来标准化功能
  **/
object Ex_StandardScaler {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml")
    val spark = SparkSession.builder().config(conf).getOrCreate()

    val data = spark.read.format("libsvm").load("input/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(data)

    // Normalize each feature to have unit standard deviation.
    val result = scalerModel.transform(data)

    result.show()
    
    spark.stop()
  }

}
posted @ 2020-01-16 16:52  我是属车的  阅读(1900)  评论(0编辑  收藏  举报