目录
一、特征处理方法
机器学习当中最重要的就是寻找数据的特征,给数据打标签。那么在SparkMLIB中提供了package org.apache.spark.ml.feature,包中封装了众多feature算子。今天剖析一下题目中的几个算子。
二、啥是特征处理
特征整体上就两类:一类是不可以用数字标识的特征:例如天气、喜好、心情、上下文等;另一类是可以用数值进行表述的特征,例如年龄、体温、价格等。那么特征处理又是个啥意思呢,通俗的说就有很多条数据,需要给这些数据对应的标识,当然如何标识的过程也是一个值得深入的问题。
下面可以画一个图来示意一下,啥是特征处理。
最后呢,根据特征列表梳理出来了小A的特征信息。
三、Spark ML中常见算子释义
3.1 Normalizer
Normalizer是SparkML中的正则函数。那么Normalizer描述的是向量在数域空间上的长度。
下面的式子,先计算出基本的向量范式。
在此范式,求出向量的表达:
下面以向量组R为例进行编码,编码结果和源码都在下文。
范式为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
转换公式如下:
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()
}
}