Масштабирование набора данных с помощью MLlib - PullRequest
1 голос
/ 19 апреля 2020

Я выполнял некоторое масштабирование для нижнего набора данных с использованием искры 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]|
+---+--------------+-------------------------------+

Пожалуйста, найдите код ниже:

// 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()

Я знаю формулу для стандартизации и минимального / максимального масштабирования, но не могу понять, как это происходит со значениями в третьем столбце, пожалуйста, помогите мне объяснить математику за ней.

1 Ответ

1 голос
/ 22 апреля 2020

MinMaxScaler в Spark работает для каждой функции в отдельности. Из документации мы имеем:

Масштабирование каждого объекта индивидуально до общего диапазона [min, max] линейно с использованием сводной статистики столбцов, которая также известна как нормализация min-max или масштабирование.

$$ Rescalled (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 (в соответствии с обычной формулой min-max).
  3. В третьем столбце минимальное значение равно -1,0, а максимальное - 3,0. Итак, мы знаем -1,0 -> 5,0 и 3,0 -> 10,0. Для 1.0 он находится посередине и станет 7,5.
...