Нормализация против масштабирования для ненормального распределения - PullRequest
1 голос
/ 21 марта 2020

В моем университетском проекте мне даны данные с различными диапазонами значений, которые также не имеют нормального распределения. Я уже читал документацию по функции нормализация склеарна , где говорилось, что нормализация - это процесс масштабирования отдельных выборок, чтобы получить единичную норму. Также в sklearn есть Normalization и StandardScaler, которые, похоже, выполняют ту же функцию, что и масштабирование данных. Но затем я прочитал эту статью , в которой говорится о различиях между масштабированием и нормализацией, различая их, говоря, что Нормализация - это способ достижения нормального распределения и Масштабирование - это путь для Вы ранжировать свои данные .

  1. Почему функция нормализации sklearn имеет одну и ту же функцию StandardScaler, если предполагается, что оба должны делать разные вещи с данными?
  2. Означает ли это, что при масштабировании мы можем достичь нормального распределения, а масштабирование на самом деле один из способов нормализовать распределение?
  3. Для моего случая, если у меня есть различные диапазоны значений, а не нормальное распределение, если Normalize и Scaling - это другое, то это означает, что я должен масштабировать и нормализовать мои данные?

1 Ответ

1 голос
/ 21 марта 2020

Нормализация имеет различные значения в зависимости от контекста, и иногда этот термин вводит в заблуждение. Я думаю, что sklearn использует термины взаимозаменяемо для обозначения корректировки значений, измеренных в разных масштабах, по условно общей шкале (например, между 0 и 1), а не для изменения данных таким образом, чтобы они следовали нормальному распределению (кроме от StandardScaler, который это делает).

Насколько я понимаю, в sklearn они отличаются входом, с которым они работают и как, и где они могут быть использованы.

Я предполагаю, что с Normalization вы имеете в виду sklearn.preprocessing.Normalizer.

Итак, основное отличие состоит в том, что sklearn.preprocessing.Normalizer масштабирует выборки в единицу нормы (длину вектора), в то время как sklearn.preprocessing.StandardScaler масштабирует показывает в единицу дисперсии после вычитания жадный. Таким образом, первый работает с строками , а второй - с столбцами .

В частности,

  1. sklearn.preprocessing.normalize "масштабирует входные векторы индивидуально до единичной нормы (длины вектора). '. Его можно применять к строкам (установив параметр axis в 1) и к элементам / столбцам (установив параметр axis до 0) .Он использует одну из следующих норм: l1, l2 или max для нормализации каждой ненулевой выборки (или каждой ненулевой функции, если ось равна 0). Примечание: Термин норма здесь относится к математическому определению. Для получения дополнительной информации см. здесь и здесь .

  2. sklearn.preprocessing.Normalizer "нормализует выборки индивидуально к единице нормы." . Он ведет себя точно так же, как sklearn.preprocessing.normalize, когда axis=1. В отличие от normalize, Normalizer выполняет нормализацию с использованием API-интерфейса Transformer (например, как часть предварительной обработки sklearn.pipeline.Pipeline).

  3. sklearn.preprocessing.StandardScaler "стандартизирует функции путем удаления среднего значения и масштабирования до единичной дисперсии ". Он не использует норму вектора, скорее он вычисляет z-показатель для каждого объекта.

Эта интересная статья исследует больше различий между ними.

Давайте для удобства воспользуемся norm='max':

from sklearn.preprocessing import normalize, Normalizer, StandardScaler

X = [[1, 2],
     [2, 4]]

# Normalize column based on the maximum of each column (x/max(column))
normalize(X, norm='max', axis=0)

# Normalize column based on the maximum of each row (x/max(row))
normalize(X, norm='max', axis=1)

# Normalize with Normalizer (only rows)
Normalizer(norm='max').fit_transform(X)

# Standardize with StandardScaler (only columns)
StandardScaler().fit_transform(X)


from sklearn.pipeline import Pipeline
pipe = Pipeline([('normalization_step', normalize())] # NOT POSSIBLE

pipe = Pipeline([('normalization_step', Normalizer())] # POSSIBLE

pipe = Pipeline([('normalization_step', StandardScaler())] # POSSIBLE

pipe.score(X, y) # Assuming y exists

Вышеупомянутые строки кода преобразуют данные следующим образом:


# Normalize with normalize, axis=0 (columns)
[[0.5, 0.5],
 [1. , 1. ]]

# Normalize with normalize, axis=1 (rows)
[[0.5, 1],
 [0.5, 1. ]]

# Normalize with Normalizer (rows)
[[0.5, 1],
 [0.5, 1. ]]

# Standardize with StandardScaler (columns)
[[-1, -1],
 [1, 1. ]]
...