Если вы использовали 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]
.
Вы получаете очень разные распределения, потому что вы не взвешиваете экстремальные значения одинаково