Spark ML中MinMaxScaler归一化数据的反归一化实现问询
如何在Spark ML中实现MinMaxScaler的反归一化操作
刚好我之前也处理过类似的需求,咱们一步步来搞定这个反归一化:
首先,你已经从训练好的MinMaxScaler中拿到了originalMin和originalMax这两个向量,第一步要把它们转成数组,这样咱们能方便地按索引对应到每个特征列:
// 将MinMaxScaler保存的min和max向量转为数组 val minArray = df_fitted.originalMin.toArray val maxArray = df_fitted.originalMax.toArray
接下来,咱们需要对DataFrame里的每一列应用反归一化公式X_original = (X_scaled * (max - min)) + min。因为你的列是col_0到col_9,正好和minArray、maxArray的索引一一对应,所以可以用循环来批量生成反归一化后的列:
// 获取当前DataFrame的所有列名 val featureCols = df.columns // 遍历每个列,生成对应的反归一化列 val denormalizedColumns = featureCols.zipWithIndex.map { case (colName, idx) => // 获取当前列对应的min和max值,转为Spark的Literal类型 val minVal = lit(minArray(idx)) val maxVal = lit(maxArray(idx)) // 应用反归一化公式,并给新列命名(比如原列名加_denorm后缀) (col(colName) * (maxVal - minVal) + minVal).alias(s"${colName}_denorm") } // 生成反归一化后的DataFrame val denormalizedDf = df.select(denormalizedColumns: _*)
这样运行之后,denormalizedDf里的每一列就是对应原始特征的反归一化结果啦。拿你给出的第一个例子验证一下:
原
col_0值:0.009069428120139292,对应min=1.0,max=804.0
计算过程:0.009069428120139292 * (804.0 - 1.0) + 1.0 ≈ 8.28275,和公式计算的结果一致。
另外,这个代码还自动处理了max == min的特殊情况(比如某个特征所有值都相同),这时候公式里max - min为0,反归一化结果直接等于min,完全符合预期。
内容的提问来源于stack exchange,提问作者diens
相关产品推荐
相关产品推荐

