使用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]|+---+--------------+

你可以在这个链接找到这个数据集 https://github.com/databricks/Spark-The-Definitive-Guide/blob/master/data/simple-ml-scaling/part-00000-cd03406a-cc9b-42b0-9299-1e259fdd9382-c000.gz.parquet

在执行标准缩放后,我得到了以下结果:

+---+--------------+------------------------------------------------------------+|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]  |+---+--------------+------------------------------------------------------------+

如果我执行最小/最大缩放(设置 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]|+---+--------------+-------------------------------+

请查看下面的代码:

// 加载数据集val scaleDF = spark.read.parquet("/data/simple-ml-scaling")// 使用StandardScalerimport org.apache.spark.ml.feature.StandardScalerval ss = new StandardScaler().setInputCol("features") ss.fit(scaleDF).transform(scaleDF).show(false)// 使用MinMaxScalerimport org.apache.spark.ml.feature.MinMaxScalerval minMax = new MinMaxScaler().setMin(5).setMax(10).setInputCol("features") val fittedminMax = minMax.fit(scaleDF) fittedminMax.transform(scaleDF).show()

我知道标准化和最小/最大缩放的公式,但无法理解第三列的值是如何得出的,请帮助我解释背后的数学原理。


回答:

MinMaxScaler 在Spark中对每个特征单独进行操作。根据文档,我们有:

使用列摘要统计数据,将每个特征线性地重新缩放到公共范围 [min, max],这也被称为最小-最大归一化或重新缩放。

$$ Rescaled(e_i) = \frac{e_i – E_{min}}{E_{max} – E_{min}} * (max – min) + min $$

[…]

因此,features 数组中的每一列将被单独缩放。在这种情况下,MinMaxScaler 设置为最小值为5,最大值为10。

因此,每列的计算将是:

  1. 在第一列中,最小值为1.0,最大值为3.0。我们有1.0 -> 5.0,和3.0 -> 10.0。因此2.0将变成7.5。
  2. 在第二列中,最小值为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(遵循常规的最小-最大公式)。
  3. 在第三列中,最小值为-1.0,最大值为3.0。所以我们知道-1.0 -> 5.0 和3.0 -> 10.0。对于1.0,它位于中间,将变成7.5。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注