Русский
Русский
English
Статистика
Реклама

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

Из песочницы Предварительная обработка данных

15.07.2020 18:16:18 | Автор: admin

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


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


Пропуски


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


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

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


$$display$$IQR = Q_3 - Q_1,$$display$$


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


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


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


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


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


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


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


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


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


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


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


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


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


где 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

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


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


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


  1. Лекция курса от Яндекса и ВШЭ "Введение в машинное обучение" на курсере.
  2. Standardization, or mean removal and variance scaling документация к библиотеке sklearn
  3. Задачи по подготовке данных для расширенного машинного обучения Microsoft
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru