Центрирование и масштабирование Pyspark Dataframe - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь реализовать нормализацию 5 функций в кадре данных искры. Все функции имеют разные масштабы.

Теоретически, правильно ли использовать Normalizer () в векторизованной форме моего фрейма данных? Другими параметрами являются MinMaxScaler () и StandardScaler (). Однако после прохождения различных реализаций я не уверен, стоит ли использовать его в каждом столбце или векторизованном фрейме данных.

Приветствую любые советы.

1 Ответ

0 голосов
/ 14 апреля 2020

Если вы использовали VectorAssembler(), ваши данные в хорошем формате для нормализации / масштабирования.

Возможны различные типы преобразований. Они будут создавать различные распределения значений в ваших векторах. Я беру примеры из этого поста .

Вопрос сейчас: какой дистрибутив имеет смысл для вас впоследствии? Вы хотите распределение N (0,1)? В этом случае используйте StandardScaler.

StandardScaler

Каждый i-й элемент ваших векторов преобразуется путем удаления среднего значения и деления на стандартное отклонение всех i -ых строк.

+---+--------------+------------------------------------------------
|id |features      |Scaled_features|
+---+--------------+------------------------------------------------
|0  |[1.0,0.1,-1.0]|[1.195228,0.02337,-0.597614]|
|1  |[2.0,1.1,1.0] |[2.390457,0.25713,0.597614]   |
|0  |[1.0,0.1,-1.0]|[1.19522,0.023376,-0.5976143046671968]|
|1  |[2.0,1.1,1.0] |[2.390457,0.257138,0.597614]   |
|1  |[3.0,10.1,3.0]|[3.585682.3609991,1.792842]  |
+---+--------------+------------------------------------------------

Учитывая название вашего вопроса, я думаю, что это операция, которую вы хотите выполнить.

Normalizer

Вы нормализуете i th значение по норме, рассчитанной по всем измерениям. Большинство общих норм - это манхэттенская норма (норма L1, которую вы использовали) и евклидова норма (норма L2).

Таким образом, вы делите каждое значение на вычисленную норму

+---+--------------+-----------------------------------------------+
|id |features      |l1_norm                    |
+---+--------------+-----------------------------------------------+
|0  |[1.0,0.1,-1.0]|[0.47619,0.047619,-0.47619]|
|1  |[2.0,1.1,1.0] |[0.48780,0.26829,0.24390]  |
|0  |[1.0,0.1,-1.0]|[0.47619,0.047619,-0.47619]|
|1  |[2.0,1.1,1.0] |[0.48780,0.26829,0.24390]  |
|1  |[3.0,10.1,3.0]|[0.18633,0.62732,0.18633]  |
+---+--------------+-----------------------------------------------+

Здесь [1,.1,-1]/sum(abs([1,.1,-1])) -> [0.47619,0.047619,-0.47619]

MinMaxScaler

Вы изменяете интервал своих значений, чтобы он соответствовал интервалу [a,b]

Пример

Допустим, у вас есть [10 000, 1, 1, 1]:

  • Normalizer: с нормой L1, [0.9997, 9.997001e-05 9.997001e-05 9.997001e-05]
  • StandardScaler: при условии, что вы вычтете среднее значение и поделите на sd, вы получите [1.5, -0.5, -0.5, -0.5].

Вы получаете очень разные распределения, потому что вы не взвешиваете экстремальные значения одинаково

...