我需要对 Spark 中使用 ML 的 MinMaxScaler
方法标准化的数据进行反标准化。
我能够按照以下步骤标准化我的数据:Spark: convert an RDD[LabeledPoint] to a Dataframe to apply MinMaxScaler, and after scaling get the normalized RDD[LabeledPoint]我之前发布过。
例如,原始的 df 具有前两列,缩放后的结果是:
+------+--------------------+--------------------+
|labels| features| featuresScaled|
+------+--------------------+--------------------+
| 1.0|[6.0,7.0,42.0,1.1...|[1.0,0.2142857142...|
| 1.0|[6.0,18.0,108.0,3...|[1.0,1.0,1.0,1.0,...|
| 1.0|[5.0,7.0,35.0,1.4...|[0.0,0.2142857142...|
| 1.0|[5.0,8.0,40.0,1.6...|[0.0,0.2857142857...|
| 1.0|[6.0,4.0,24.0,0.6...|[1.0,0.0,0.0,0.0,...|
+------+--------------------+--------------------+
问题是,现在我需要执行相反的过程:去规范化。
为此,我需要 features
向量内每个特征列的 min
和 max
值,以及要非规范化的值。
要获取 min
和 max
,我向 MinMaxScaler
请求如下:
val df_fitted = scaler.fit(df_all)
val df_fitted_original_min = df_fited.originalMin // Vector
val df_fitted_original_max = df_fited.originalMax // Vector
df_fited_original_min[1.0,1.0,7.0,0.007,0.052,0.062,1.0,1.0,7.0,1.0]
df_fited_original_max[804.0,553.0,143993.0,537.0,1.0,1.0,4955.0,28093.0,42821.0,3212.0]
另一方面,我的 DataFrame 如下:
+--------------------+-----+--------------------+--------------------+-----+-----+--------------------+--------------------+--------------------+-----+
| col_0|col_1| col_2| col_3|col_4|col_5| col_6| col_7| col_8|col_9|
+--------------------+-----+--------------------+--------------------+-----+-----+--------------------+--------------------+--------------------+-----+
|0.009069428120139292| 0.0|9.015488712438252E-6|2.150418860440459E-4| 1.0| 1.0|0.001470074844665...|2.205824685144127...|2.780971210319238...| 0.0|
|0.008070826019024355| 0.0|3.379696051366339...|2.389342641479033...| 1.0| 1.0|0.001308210192425627|1.962949264985630...|1.042521123176856...| 0.0|
|0.009774715414895803| 0.0|1.299590589291292...|1.981673063697640...| 1.0| 1.0|0.001584395736407...|2.377361424206848...| 4.00879434193585E-5| 0.0|
|0.009631155146285946| 0.0|1.218569739510422...|2.016021040879828E-4| 1.0| 1.0|0.001561125874539...|2.342445354515269...|3.758872615157643E-5| 0.0|
现在,我需要应用以下方程来获取新值,但我不知道如何实现。
X_original = ( X_scaled * (max - min) ) + min
对于 DF 中的每个位置,我必须将此方程与相应的 max
和 min
值应用到向量中。
例如:DF的第一行第一列是0.009069428120139292
。在同一列中,对应的 min
和 max
值为:1.0
和 804.0
。
因此,非规范化值是:
X_den = ( 0.009069428120139292 * (804.0 - 1.0) ) + 1.0
有必要澄清的是,在程序期间首先标准化的 DF 被修改了。因此,我需要应用反规范化(如果没有,最简单的方法是保留原始 DF 的副本)。
最佳答案
您“简单地”以相反的顺序应用逆运算。该方程在文档 here 中。感兴趣的代码是:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
您现在拥有 X_saled
值的数据集,并且您想要恢复原始 X
值。您面临的直接问题是您在转换中丢失一些基本信息。 X_scaled
是范围 [0, 1] 上的一组数据;你无法知道原始范围是多少。
要实现此目的,请找到并保留原始的 min
和 `max 值。现在,可以轻松反转每个元素的线性变换:
X_original = X_scaled * (max - min) + min
你能从那里拿走它吗?
关于scala - Spark ML : Data de-normalization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50279674/