1.标准化StandardScaler
1.1 概述
我们知道,在训练模型的时候,要输入features,即因子,也叫特征。对于同一个特征,不同的样本中的取值可能会相差非常大,一些异常小或异常大的数据会误导模型的正确训练;另外,如果数据的分布很分散也会影响训练结果。以上两种方式都体现在方差会非常大。此时,我们可以将特征中的值进行标准差标准化,即转换为均值为0,方差为1的正态分布。所以在训练模型之前,一定要对特征的数据分布进行探索,并考虑是否有必要将数据进行标准化。
标准差标准化也叫作Z-zero标准化,经过处理的数据会符合标准正态分布,即均值为0,方差为1。转化函数为:
x* = (x - μ) /σ
公式中标准化后的值x* 等于 原来的值x先减去原数据的均值μ,然后在除以原数据的标准差σ。最后得到的新的数据的均值就是0,方差/标准差为1.
注:是否要进行标准化,要根据具体实验定。如果特征非常稀疏,并且有大量的0(现实应用中很多特征都具有这个特点),Z-score 标准化的过程几乎就是一个除0的过程,结果不可预料。
1.2 spark代码
1.2.1 基于RDD
SparkMLLIB提供了基于RDD的函数接口:
1.参数的设置
在mllib封装的StandardScaler方法中需要设置两个参数:
(1)withMean: 这是一个布尔类型的参数,可输入true,表示转化为均值为0,要注意的是它输出的结果是密集的,所以输入的数据不能是稀疏的,否则会报错哒。另外也可以设置false,表示对均值不做变化,如果不设置,默认是false.
(2)withStd:这也是一个布尔类型的参数,输入true表示将数据规模化到方差为1,默认情况下为true.
2.用法
mllib在StandardScaler中提供了一份fit 的方法,输入的参数是RDD[Vector].这个方法会对数据进行描述性统计,并输出一个模型,用这个模型来讲输入数据转换成方差为1或/和均值为0的特征数据(均值是否需要变成0是可以自己调整参数决定的)
另外,模型的输入也可以是一个Vector,无论输入哪种格式,计算后的结果会都会输出一个RDD[Vector]
3.代码与方法解读
package com.mllib.featureextraction
import org.apache.spark.mllib.feature.StandardScaler
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by wangcao on 2016/7/29.
*/
object StandardScaler {
def main (args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("StandardScaler").setMaster("local")
val sc = new SparkContext(conf)
val data = MLUtils.loadLibSVMFile(sc, "C:\\Users\\Administrator\\Downloads\\sample_libsvm_data.txt")
//1.不设置任何参数,自动是默认的withMean=False and withStd=True
//注:new StandardScaler().只有一个fit的方法,fit里可传入一个Vector 或 RDD[Vector]
//使用fit生成的是一个StandardScalerModel
val scaler1 = new StandardScaler().fit(data.map(x => x.features))