1、概念
z−score規范化,又叫零均值規范化
將某個特征向量(由所有樣本某一個特征組成的向量)進行標准化,使數據均值為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() } }