使用 MLlib 缩放数据集
Scaling dataset with MLlib
我正在使用 spark MLlib 对以下数据集进行一些缩放:
+---+--------------+
| id| features|
+---+--------------+
| 0|[1.0,0.1,-1.0]|
| 1| [2.0,1.1,1.0]|
| 0|[1.0,0.1,-1.0]|
| 1| [2.0,1.1,1.0]|
| 1|[3.0,10.1,3.0]|
+---+--------------+
处找到此数据集的 link
执行标准缩放后,我得到以下结果:
+---+--------------+------------------------------------------------------------+
|id |features |stdScal_06f7a85f98ef__output |
+---+--------------+------------------------------------------------------------+
|0 |[1.0,0.1,-1.0]|[1.1952286093343936,0.02337622911060922,-0.5976143046671968]|
|1 |[2.0,1.1,1.0] |[2.390457218668787,0.2571385202167014,0.5976143046671968] |
|0 |[1.0,0.1,-1.0]|[1.1952286093343936,0.02337622911060922,-0.5976143046671968]|
|1 |[2.0,1.1,1.0] |[2.390457218668787,0.2571385202167014,0.5976143046671968] |
|1 |[3.0,10.1,3.0]|[3.5856858280031805,2.3609991401715313,1.7928429140015902] |
+---+--------------+------------------------------------------------------------+
如果我执行 min/max 缩放(设置 val minMax = new MinMaxScaler().setMin(5).setMax(10).setInputCol("features")
),我得到以下结果:
+---+--------------+-------------------------------+
| id| features|minMaxScal_21493d63e2bf__output|
+---+--------------+-------------------------------+
| 0|[1.0,0.1,-1.0]| [5.0,5.0,5.0]|
| 1| [2.0,1.1,1.0]| [7.5,5.5,7.5]|
| 0|[1.0,0.1,-1.0]| [5.0,5.0,5.0]|
| 1| [2.0,1.1,1.0]| [7.5,5.5,7.5]|
| 1|[3.0,10.1,3.0]| [10.0,10.0,10.0]|
+---+--------------+-------------------------------+
请找到下面的代码:
// loading dataset
val scaleDF = spark.read.parquet("/data/simple-ml-scaling")
// using standardScaler
import org.apache.spark.ml.feature.StandardScaler
val ss = new StandardScaler().setInputCol("features")
ss.fit(scaleDF).transform(scaleDF).show(false)
// using min/max scaler
import org.apache.spark.ml.feature.MinMaxScaler
val minMax = new MinMaxScaler().setMin(5).setMax(10).setInputCol("features")
val fittedminMax = minMax.fit(scaleDF)
fittedminMax.transform(scaleDF).show()
我知道标准化和 min/max 缩放的公式,但无法理解它是如何得出第三列中的值的,请帮我解释一下它背后的数学原理。
MinMaxScaler
在 Spark 中单独处理每个功能。从文档我们有:
Rescale each feature individually to a common range [min, max] linearly using column summary statistics, which is also known as min-max normalization or Rescaling.
$$ Rescaled(e_i) = \frac{e_i - E_{min}}{E_{max} - E_{min}} * (max - min) + min $$
[...]
因此 features
数组中的每一列都将单独缩放。
在本例中,MinMaxScaler
设置为最小值为 5,最大值为 10。
因此,每列的计算结果为:
- 在第一列中,最小值为 1.0,最大值为 3.0。我们有 1.0 -> 5.0 和 3.0 -> 10.0。 2.0 会变成 7.5.
- 在第二列中,最小值为 0.1,最大值为 10.1。我们有 0.1 -> 5.0 和 10.1 -> 10.0。该列中唯一的其他值是 1.1,它将变为 ((1.1-0.1) / (10.1-0.1)) * (10.0 - 5.0) + 5.0 = 5.5(遵循正常的最小-最大公式)。
- 在第三列中,最小值为-1.0,最大值为3.0。所以我们知道 -1.0 -> 5.0 和 3.0 -> 10.0。对于 1.0,它位于中间,将变为 7.5。
我正在使用 spark MLlib 对以下数据集进行一些缩放:
+---+--------------+
| id| features|
+---+--------------+
| 0|[1.0,0.1,-1.0]|
| 1| [2.0,1.1,1.0]|
| 0|[1.0,0.1,-1.0]|
| 1| [2.0,1.1,1.0]|
| 1|[3.0,10.1,3.0]|
+---+--------------+
处找到此数据集的 link
执行标准缩放后,我得到以下结果:
+---+--------------+------------------------------------------------------------+
|id |features |stdScal_06f7a85f98ef__output |
+---+--------------+------------------------------------------------------------+
|0 |[1.0,0.1,-1.0]|[1.1952286093343936,0.02337622911060922,-0.5976143046671968]|
|1 |[2.0,1.1,1.0] |[2.390457218668787,0.2571385202167014,0.5976143046671968] |
|0 |[1.0,0.1,-1.0]|[1.1952286093343936,0.02337622911060922,-0.5976143046671968]|
|1 |[2.0,1.1,1.0] |[2.390457218668787,0.2571385202167014,0.5976143046671968] |
|1 |[3.0,10.1,3.0]|[3.5856858280031805,2.3609991401715313,1.7928429140015902] |
+---+--------------+------------------------------------------------------------+
如果我执行 min/max 缩放(设置 val minMax = new MinMaxScaler().setMin(5).setMax(10).setInputCol("features")
),我得到以下结果:
+---+--------------+-------------------------------+
| id| features|minMaxScal_21493d63e2bf__output|
+---+--------------+-------------------------------+
| 0|[1.0,0.1,-1.0]| [5.0,5.0,5.0]|
| 1| [2.0,1.1,1.0]| [7.5,5.5,7.5]|
| 0|[1.0,0.1,-1.0]| [5.0,5.0,5.0]|
| 1| [2.0,1.1,1.0]| [7.5,5.5,7.5]|
| 1|[3.0,10.1,3.0]| [10.0,10.0,10.0]|
+---+--------------+-------------------------------+
请找到下面的代码:
// loading dataset
val scaleDF = spark.read.parquet("/data/simple-ml-scaling")
// using standardScaler
import org.apache.spark.ml.feature.StandardScaler
val ss = new StandardScaler().setInputCol("features")
ss.fit(scaleDF).transform(scaleDF).show(false)
// using min/max scaler
import org.apache.spark.ml.feature.MinMaxScaler
val minMax = new MinMaxScaler().setMin(5).setMax(10).setInputCol("features")
val fittedminMax = minMax.fit(scaleDF)
fittedminMax.transform(scaleDF).show()
我知道标准化和 min/max 缩放的公式,但无法理解它是如何得出第三列中的值的,请帮我解释一下它背后的数学原理。
MinMaxScaler
在 Spark 中单独处理每个功能。从文档我们有:
Rescale each feature individually to a common range [min, max] linearly using column summary statistics, which is also known as min-max normalization or Rescaling.
$$ Rescaled(e_i) = \frac{e_i - E_{min}}{E_{max} - E_{min}} * (max - min) + min $$
[...]
因此 features
数组中的每一列都将单独缩放。
在本例中,MinMaxScaler
设置为最小值为 5,最大值为 10。
因此,每列的计算结果为:
- 在第一列中,最小值为 1.0,最大值为 3.0。我们有 1.0 -> 5.0 和 3.0 -> 10.0。 2.0 会变成 7.5.
- 在第二列中,最小值为 0.1,最大值为 10.1。我们有 0.1 -> 5.0 和 10.1 -> 10.0。该列中唯一的其他值是 1.1,它将变为 ((1.1-0.1) / (10.1-0.1)) * (10.0 - 5.0) + 5.0 = 5.5(遵循正常的最小-最大公式)。
- 在第三列中,最小值为-1.0,最大值为3.0。所以我们知道 -1.0 -> 5.0 和 3.0 -> 10.0。对于 1.0,它位于中间,将变为 7.5。