【问题标题】: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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2022-01-22
      相关资源
      最近更新 更多