В этом посте я объясню, почему и как применять стандартизацию с помощью scikit-learn в Python.

Всем привет.

Это мой первый пост на Medium. Я инженер-электрик и компьютерный инженер, в настоящее время заканчиваю докторскую диссертацию в области биомедицинской инженерии и вычислительной нейробиологии. Я работаю над проблемами машинного обучения последние 4 года. Очень распространенный вопрос, который я вижу повсюду в сети, - как стандартизировать и зачем это делать, данные до того, как они будут соответствовать модели машинного обучения.

Как работает StandardScaler scikit-learn?

Первый вопрос, который приходит в голову:

Зачем в первую очередь стандартизировать?

Зачем стандартизировать перед установкой модели машинного обучения?

Что ж, идея проста. Переменные, которые измеряются в разных масштабах, не вносят одинаковый вклад в функцию подгонки модели и изучения модели и могут в конечном итоге вызвать смещение. Таким образом, для решения этой потенциальной проблемы перед подгонкой модели обычно используется стандартизованный по характеристикам (μ = 0, σ = 1).

Чтобы сделать это с помощью scikit-learn, нам сначала нужно создать входной массив X, содержащий функции и образцы с X.shape being[number_of_samples, number_of_features].

Имейте в виду, что все scikit-learn функции машинного обучения (ML) ожидают в качестве входных данных numpy массив X с этой формой, т.е. строки являются образцами, а столбцы - функциями / переменными. Сказав это, давайте предположим, что у нас есть матрица X, где каждая строка / строка - это образец / наблюдение, а каждый столбец - переменная / функция.

Примечание. Древовидные модели обычно не зависят от масштабирования, но модели недревесных моделей, такие как SVM, LDA и т. д., часто сильно зависят от него.

Суть метода

Основная идея состоит в том, чтобы нормализовать / стандартизировать то есть μ = 0 и σ = 1 ваши функции / переменные / столбцы из X, индивидуально, до применение любой модели машинного обучения. Таким образом, StandardScaler() будет нормализовать функции, т.е. каждый столбец X, ИНДИВИДУАЛЬНО, так что каждый столбец / функция / переменная будет иметь μ = 0 и σ = 1.

Пример рабочего кода Python:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
X = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
# the scaler object (model)
scaler = StandardScaler()
# fit and transform the data
scaled_data = scaler.fit_transform(X) 

print(X)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]

Убедитесь, что среднее значение каждой функции (столбца) равно 0:

scaled_data.mean(axis = 0)
array([0., 0.])

Убедитесь, что стандартное значение каждой функции (столбца) равно 1:

scaled_data.std(axis = 0)
array([1., 1.])

Эффект трансформации на визуальном примере

Резюме

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

Как бороться с выбросами

  • Ручной способ (не рекомендуется): визуально проверьте данные и удалите выбросы, используя статистические методы удаления выбросов, такие как метод порогового значения межквартильного размаха (IQR).
  • Рекомендуемый способ: используйте RobustScaler, который просто масштабирует функции, но в данном случае использует статистику, устойчивую к выбросам. Этот инструмент масштабирования удаляет медианное значение и масштабирует данные в соответствии с квантильным диапазоном (по умолчанию IQR : Межквартильный размах). IQR - это диапазон между 1-м квартилем (25-й квантиль) и 3-м квартилем (75-й квантиль).

Это все на сегодня! Надеюсь, вам понравился этот первый пост! Следующая история выйдет на следующей неделе. Оставайтесь с нами и будьте в безопасности.

Оставайся с нами и поддержи меня

Если вам понравилась и эта статья показалась вам полезной, подпишитесь на меня и аплодируйте моей истории, чтобы поддержать меня!

- Мой список рассылки всего за 5 секунд: https://seralouk.medium.com/subscribe

- Станьте участником и поддержите меня: https://seralouk.medium.com/membership

Ссылки

[1] https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

[2] https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.RobustScaler.html

Свяжись со мной