Spark ML机器学习:归一化之最小最大值标准化-MinMaxScaler
MinMaxScaler
转换由向量行组成的数据集,将每个特征调整到一个特定的范围(通常是[0,1]
)。它有下面两个参数:
min
:默认是0。转换的下界,被所有的特征共享。max
:默认是1。转换的上界,被所有特征共享。
MinMaxScaler
计算数据集上的概要统计数据,产生一个MinMaxScalerModel
。然后就可以用这个模型单独的转换每个特征到特定的范围。 特征E
被转换后的值可以用下面的公式计算:
$$\frac{e_{i} – E_{min}}{E_{max} – E_{min}} * (max – min) + min$$
对于E_{max} == E_{min}
的情况,Rescaled(e_i) = 0.5 * (max + min)
。
注意,由于0值有可能转换成非0的值,所以转换的输出为DenseVector
,即使输入为稀疏的数据也一样。下面的例子展示了如何将特征转换到[0,1]
。例子:
// $example on$
import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.MinMaxScaler
import org.apache.spark.ml.linalg.Vectors
// $example off$
import org.apache.spark.sql.SparkSession
object MinMaxScalerExample {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf();
sparkConf.setMaster("local[*]").setAppName(this.getClass.getSimpleName)
val spark = SparkSession
.builder
.config(sparkConf)
.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()
}
}
结果:
+————–+————–+
| features|scaledFeatures|
+————–+————–+
|[1.0,0.1,-1.0]| [0.0,0.0,0.0]|
| [2.0,1.1,1.0]| [0.5,0.1,0.5]|
|[3.0,10.1,3.0]| [1.0,1.0,1.0]|
+————–+————–+