Как стать автором
Обновить

Предварительная обработка данных

Время на прочтение6 мин
Количество просмотров25K

Всем привет! Я веб-разработчик и вот уже несколько лет интересуюсь машинным обучением. Поскольку в повседневной рабочей парктике мне приходится решать менее интересные для меня задачи, не связанные с машинным обучением, время от времени я забываю то, о чем когда-то читал или использовал. Чтобы составить памятку для себя, укрепить свои знания и поделиться ими с окружающими, я решил написать несколько статей по машинному обучению. Начну с предварительной обработки данных.


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


Пропуски


Рассмотрим набор данных следующего вида. Я его честно придумал и далее в рамках этой статьи буду ссылаться на него.


ID Имя Спортивная дисциплина Страна Год рождения спортсмена Вес спортсмена Медаль
1 Иван Академическая гребля Российская Федерация 1985 265 B
2 Бокс Великобритания 1986 54 S
3 Ким Греко-римская борьба Северная Корея 1986 93 G
4 Олег Греко-римская борьба 1984 B
5 Педро Академическая гребля Бразилия 97 N
6 Валерий Академическая гребля Российская Федерация 2004 97 N

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


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


Категориальный признак — признак, значение которого можно отнести к какой-либо группе, но порядок значений в этой группе абсолютно не важен. Более того, между значениями категориальных признаков невозможно установить отношения "больше" или "меньше". Однако, никто не мешает исследователю отсортировать значения признака, например, по алфавиту для наглядности или по какому-либо другому критерию для какой-либо другой цели. Примеры категориальных признаков в моем наборе данных: Имя, Спортивная дисциплина, Страна, Год рождения спортсмена.


Значения численного признака является скаляром. Объекты в наборе данных можно упорядочить по значению такого признака в возрастающем или убывающем порядке. В качестве примеров численного признака можно привести Год рождения спортсмена и Вес спортсмена.


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


Пропуски в категориальных признаках


Заполнить пропуски в категориальных признаках можно следующими способами:


  • Заменить пропущенное значение новой категорией "Неизвестно".

ID Имя Спортивная дисциплина Страна Год рождения спортсмена Вес спортсмена Медаль
2 Неизвестно Бокс Великобритания 1986 54 S

  • Заменить пропущенное значение наиболее популярным значением.

ID Имя Спортивная дисциплина Страна Год рождения спортсмена Вес спортсмена Медаль
4 Олег Греко-римская борьба Российская Федерация 1984 B

Пропуски в численных признаках


Если имеем дело с численными признаками, можно применить следующие подходы:


  • Заменить пропущенное значение средним значением.

ID Имя Спортивная дисциплина Страна Год рождения спортсмена Вес спортсмена Медаль
4 Олег Греко-римская борьба 1984 (265 + 54 + 93 + 97 + 97) / 5 = 121.2 B

Как видно из примера выше, выброс значения признака "Вес спортсмена" в строке с идентификатором 1 очень сильно повлиял на среднее значение.


  • Заменить пропущенное значение медианой. Если в данных присутствуют выбросы, этот способ замены пропусков является предпочтительным.

ID Имя Спортивная дисциплина Страна Год рождения спортсмена Вес спортсмена Медаль
4 Олег Греко-римская борьба 1984 Медиана(54, 93, 97, 97, 265) = 97 B

Выбросы


В данных могут присутствовать значения, являющиеся выбросами. Это, как правило, не ошибки. Однако, своими значениями они "шокируют" модель. Пример выброса — значение веса Ивана из таблицы выше (ниже продублирована строка).


ID Имя Спортивная дисциплина Страна Год рождения спортсмена Вес спортсмена Медаль
1 Иван Академическая гребля Российская Федерация 1985 265 B

Для того, чтобы определить, является ли значение выбросом, пользуются характеристикой выборки, называемой интерквартильным размахом. Определяется он следующим образом:


$IQR = Q_3 - Q_1,$


где $Q_1$ — первая квартиль — такое значение признака, меньше которого ровно 25% всех значений признаков. $Q_3$ — третья квартиль — значение, меньше которого ровно 75% всех значений признака.


Для того, чтобы понять, является ли значение выбросом, можно воспользоваться эвристикой: выбросы лежат за пределами следующего интервала:


$[ Q_1 -1.5IQR, Q_3 + 1.5IQR ]$


Чаще всего от выбросов в обучающей выборке лучше всего избавляться.


Нормализация


Нормализация — это приведение всех значений признака к новому диапазону. Например, к диапазону [0, 1]. Это полезно, поскольку значения признаков могут изменяться в очень большом диапазоне. Причем, значения разных признаков могут отличаться на несколько порядков. А после нормализации они все будут находиться в узком (и, часто, едином) диапазоне.


Наиболее популярным способом нормализации является нормализация методом минимакса. Для того, чтобы применить этот метод, должно быть известно максимальное и минимальное значение признака. Проблема в том, что эти значения известны не всегда.


$ x_{new} = \frac{ x_{old} - x_{min}} {x_{max} - x_{min}} $


Также довольно популярным методом является Z-нормализация. Диапазон новых значений для Z-нормализации выглядит следующим образом:


$(-3σ[X], 3σ[X]),$


где $σ[X]$ — среднеквадратическое отклонение признака X.


Выполняется Z-нормализация по формуле ниже.


$x_{new} = \frac{x_{old} - M[X]} {σ[X]}$


где M[X] — математическое ожидание признака X.


Отмечу, что в случае применения Z-нормализации к нескольким признакам, диапазон значений для них будет разным.


One-hot encoding


Это способ предварительной обработки категориальных признаков. Многие модели плохо работают с категориальными признаками как таковыми. Дело в том, что слово "Российская Федерация" нельзя просто взять и умножить на какое-нибудь число. Но многие модели работают именно так: берется коэффициент и на него умножается значение признака. Аналогичная операция выполняется с остальными признаками. Все результаты суммируются. На основе значения суммы делается вывод о принадлежности объекта к тому или иному классу (такие модели называются линейными).


Однако, как поступать с признаками, значения которых нельзя выразить численно? Можно заменить их значения численным идентификатором. Например, вместо значения "Российская Федерация" использовать значение 1, а вместо "Великобритания" — 2. Тогда линейная модель будет работать. Но, если поступить таким образом, будет утеряно свойство категориальности признака. Иными словами, модель будет пытаться сравнивать идентификаторы признаков между собой. Но они не сравнимы по значению.


Чтобы бороться с этой проблемой, был придуман способ преобразовать исходный признак в несколько новых, бинарных признаков. Например, можно признак "Страна" превратить в 4 новых бинарных признака следующим образом:


ID Имя Страна_Российская Федерация Страна_Великобритания Страна_Северная Корея Страна_Бразилия
1 Иван 1 0 0 0
2 Майкл 0 1 0 0
3 Ким 0 0 0 1 0
4 Олег 1 0 0 0
5 Педро 0 0 0 1
6 Валерий 1 0 0 0

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


Заключение


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


Спасибо, что дочитал или долистал до сюда. Я описал далеко не все способы предварительной обработки, да и эта статья вряд ли пригодится профессиональным data scientist-ам. Однако, если ты новичок и не знаешь что делать со своими данными, можешь смело сюда возвращаться. Удачи в обучении и интересных задач!


Список источников


Я не ученый и эта статья не претендует на звание научной. Поэтому и источники я не буду оформлять по ГОСТам. Прошу за это меня извинить.


  1. Лекция курса от Яндекса и ВШЭ "Введение в машинное обучение" на курсере.
  2. Standardization, or mean removal and variance scaling — документация к библиотеке sklearn
  3. Задачи по подготовке данных для расширенного машинного обучения — Microsoft
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 9: ↑8 и ↓1+7
Комментарии2

Публикации

Истории

Работа

Data Scientist
61 вакансия

Ближайшие события