【问题标题】:MinMax transformation on dataframe using Scala使用 Scala 对数据框进行 MinMax 转换
【发布时间】:2023-03-07 04:20:01
【问题描述】:
我有一个需要标准化的数字特征DataFrame。为此,我使用 python MinMaxScaler 对DataFrame 的所有列执行以下操作:
X = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
现在我正在考虑使用 Scala 来做到这一点。一种方法是在 Scala 中使用MinMaxScaler,但它会生成一组特征并将其存储为新列。如何在使用 MinMaxScaler 的同时仍然拥有多列缩放特征?
【问题讨论】:
标签:
scala
apache-spark
minmax
【解决方案1】:
确实如此 - MinMaxScaler 适用于矢量类型。但是您可以轻松地将其转换为单值列并获得您想要的。您可以一次处理单个列 - 缩放每一列并返回缩放的数据框。以下是解决方法:
val columns = df.columns
// for each column turn it into DenseVector and apply MinMaxScaler
val steps = columns.flatMap { column => Array(
new VectorAssembler().setInputCols(Array(column)).setOutputCol(s"${column}_feature"),
new MinMaxScaler().setInputCol(s"${column}_feature").setOutputCol(s"${column}_scaled")
)}
// apply transformation
val pipeline = new Pipeline().setStages(steps)
val scaledDf = pipeline.fit(df).transform(df)
// helper UDF function
val headValue = udf((vec: DenseVector) => vec(0))
// rename scaled column to original column name
scaledDf
.select(columns.map(column => headValue(col(s"${column}_scaled")).alias(column)): _*)
.show()