August 1, 2021

Как складывать гречку и сосиски для AI модели

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

Стандартизация или z-оценка (z = (x - u) / s) предполагает вычитание из значения признака среднего по всему набору и деление на стандартное отклонение. Это делается для того, чтобы все признаки находились в некотором диапазоне (иначе что значит сумма 200 гр. гречки и 3 баварских сосисок).

Рассмотрим гипотетический пример.

Пусть мы имеем три наблюдения, характеризующих ужин - первый день 100 гр. гречки и 2 баварские сосиски, другой – 150 гр. гречки и 3 баварские сосиски, а третий – 50 гр. гречки и 1 баварская сосиска. Среднее для гречки по всем дням – 100 гр., а сосисок – 2. Стандартное отклонение считается по формуле:

После преобразования стандартизованные величины гречки и баварских сосисок стали безразмерными (не измеряются ни в граммах, ни в штуках) и равными. Можно считать, что 50 гр. гречки «эквивалентно» 1 сосиске.

Теперь посмотрим, как стандартизация реализуется средствами Python и библиотеки scikit-learn. Создадим простой датафрейм:

и применим класс StandardScaler для стандартизации:

Как можно заметить, настройка экземпляра класса происходит посредством вызова метода fit, а преобразование - transform. Кроме того, в свойствах объекта

mean_, var_, scale_ хранятся среднее, дисперсия и стандартное отклонение:

Напоследок отмечу, что оценка стандартного отклонения и дисперсии (квадрат последнего) применяемая классом StandardScaler по умолчанию может вызвать критику математиков, так как в знаменателе содержит деление на множество наблюдений (m в формуле выше). В то же время эта оценка является смещенной, в реальности правильнее делить на m-1. Для внесения соответствующих коррективов можно воспользоваться функцией std из библиотек NumPy или Pandas для подсчета стандартного отклонения с параметром ddof = 1 (в Pandas по умолчанию равен 1):