Spark ML机器学习:标准化-StandardScaler

1 动机

  
对于同一个特征,不同的样本中的取值可能会相差非常大,一些异常小或异常大的数据会误导模型的正确训练;另外,如果数据的分布很分散也会影响训练结果。以上两种方式都体现在方差会非常大。此时,我们可以将特征中的值进行标准差标准化,即转换为均值为0,方差为1的正态分布。如果特征非常稀疏,并且有大量的0(现实应用中很多特征都具有这个特点),Z-score 标准化的过程几乎就是一个除0的过程,结果不可预料。所以在训练模型之前,一定要对特征的数据分布进行探索,并考虑是否有必要将数据进行标准化。基于特征值的均值(mean)和标准差(standard deviation)进行数据的标准化。它的计算公式为:标准化数据=(原数据-均值)/标准差。标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

因为在原始的资料中,各变数的范围大不相同。对于某些机器学习的算法,若没有做过标准化,目标函数会无法适当的运作。举例来说,多数的分类器利用两点间的距离计算两点的差异, 若其中一个特征具有非常广的范围,那两点间的差异就会被该特征左右,因此,所有的特征都该被标准化,这样才能大略的使各特征依比例影响距离。另外一个做特征缩放的理由是他能使加速梯度下降法的收敛。

2 方法

2.1 重新缩放

  最简单的方式是重新缩放特征的范围到[0, 1][-1, 1], 依据原始的资料选择目标范围,通式如下:

3.1

2.2 标准化

  在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中。

3 实例

  


// $example on$
import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.StandardScaler
// $example off$
import org.apache.spark.sql.SparkSession

object StandardScalerExample {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf();
sparkConf.setMaster("local[*]").setAppName(this.getClass.getSimpleName)
val spark = SparkSession
.builder
.config(sparkConf)
.appName("StandardScalerExample")
.getOrCreate()

// $example on$
val dataFrame = spark.read.format("libsvm").load("D:/java/spark/spark/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()
// $example off$

spark.stop()
}
}
// scalastyle:on println

  结果:

+—–+——————–+——————–+
|label| features| scaledFeatures|
+—–+——————–+——————–+
| 0.0|(692,[127,128,129…|(692,[127,128,129…|
| 1.0|(692,[158,159,160…|(692,[158,159,160…|
| 1.0|(692,[124,125,126…|(692,[124,125,126…|
| 1.0|(692,[152,153,154…|(692,[152,153,154…|
| 1.0|(692,[151,152,153…|(692,[151,152,153…|
| 0.0|(692,[129,130,131…|(692,[129,130,131…|
| 1.0|(692,[158,159,160…|(692,[158,159,160…|
| 1.0|(692,[99,100,101,…|(692,[99,100,101,…|
| 0.0|(692,[154,155,156…|(692,[154,155,156…|
| 0.0|(692,[127,128,129…|(692,[127,128,129…|
| 1.0|(692,[154,155,156…|(692,[154,155,156…|
| 0.0|(692,[153,154,155…|(692,[153,154,155…|
| 0.0|(692,[151,152,153…|(692,[151,152,153…|
| 1.0|(692,[129,130,131…|(692,[129,130,131…|
| 0.0|(692,[154,155,156…|(692,[154,155,156…|
| 1.0|(692,[150,151,152…|(692,[150,151,152…|
| 0.0|(692,[124,125,126…|(692,[124,125,126…|
| 0.0|(692,[152,153,154…|(692,[152,153,154…|
| 1.0|(692,[97,98,99,12…|(692,[97,98,99,12…|
| 1.0|(692,[124,125,126…|(692,[124,125,126…|
+—–+——————–+——————–+

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注