Spark推荐系统,干货,心得
点击上方蓝字关注~
归一化:将每个要素的重新映射到特定范围(通常为[0,1])
spark中使用MinMaxScaler(最大-最小规范化)
他需要的参数:
min:默认为0.0,转换后的下限
max:默认为1.0,转换后的上限
MinMaxScaler计算数据集的统计信息,并生成MinMaxScalerModel,然后,模型可以单独转换每个要素,使其在给定的范围内。
特征E的重新缩放值被计算为:
对于情况Emax==Emin,Rescaled(ei)= 0.5(max+min)
请注意,由于零值可能会转换为非零值,即使对于稀疏输入,变压器的输出也将为DenseVector(稠密矩阵)
那么为什么进行特征归一化?
为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得
不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响,如果
使用米(m)和千克(kg)作为单位,那么身高特征会在1.6~1.8m的数值范围
内,体重特征会在50~100kg的范围内,分析出来的结果显然会倾向于数值差别比
较大的体重特征。想要得到更为准确的结果,就需要进行特征归一化处理,使各指标处于同一数值量级,以便进行分析。
借助随机梯度下降的实例来
说明归一化的重要性。假设有两种数值型特征,x 1 的取值范围为 [0, 10],x2 的取值
范围为[0, 3],于是可以构造一个目标函数符合图1.1(a)中的等值图。
在学习速率相同的情况下,x1 的更新速度会大于x 2 ,需要较多的迭代才能找到
最优解。如果将x 1 和x 2 归一化到相同的数值区间后,优化目标的等值图会变成图
1.1(b)中的圆形,x 1 和x 2 的更新速度变得更为一致,容易更快地通过梯度下降找
到最优解。
当然,数据归一化并不是万能的。在实际应用中,通过梯度下降法求解的模
型通常是需要归一化的,包括线性回归、逻辑回归、支持向量机、神经网络等模
型。但对于决策树模型则并不适用,以C4.5为例,决策树在进行节点分裂时主要
依据数据集D关于特征x的信息增益比,而信息增益比跟特征是否经过归一化是无关的,
因为归一化并不会改变样本在特征x上的信息增益。
object MinMaxScalerExample {
def main(args: Array[String]): Unit = {
val spark = CreateSparkSession.creteLocalSparkSession(this.getClass.getName)
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")
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(false)
}
}
运行结果:
推荐阅读:
ChiSqSelector卡方选择器
长按识别二维码关注我们