Готовим данные для анализа правильно

image

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

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

Решение задач анализа данных состоит из двух больших этапов:
1) Подготовка данных.
2) Построение на подготовленных данных моделей.

На практике, качество итоговых моделей намного сильнее зависит от качества подготовленных данных, чем от выбора самой модели и её оптимизации.

Например, XGBoost может дать улучшение качества модели порядка 5% по сравнению со случайным лесом, нейронная сеть до 3% по сравнению с XGBoost. Оптимизации, регуляризация и подбор гиперпараметров может ещё добавить 1–5%.

Но просто добавив информационные признаки, извлечённые из тех же данных, которые уже есть, можно сразу получить до 15% прироста качества модели.

Построение признакового пространства


image

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

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

В своей работе я придерживаюсь следующих основных принципов:
1. найти все возможные характеристики описываемых моделью объектов;
2. не делать предположения о важности извлекаемых из данных параметров;
3. извлекаемые параметры должны быть осмыслены.

Расскажу о каждом пункте подробнее

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

Мы извлекаем всю цифровую информацию, которая может как-то охарактеризовать каждый аспект нашего объекта.
Когда-то такой подход считался плохой практикой. Линейные модели не могли работать с коррелирующими параметрами, так как это приводило к плохой обусловленности матриц, неограниченному росту весов. Сегодня проблема мультиколлинеарности практически исчерпана за счёт использования продвинутых алгоритмов и методов регуляризации. Если у вас есть рост и вес человека — берите оба эти параметра. Да, они коррелируют, но мультиколлинеарность — в прошлом. Просто используйте современные алгоритмы и регуляризацию.

Итак, рассмотрите каждый аспект вашего объекта и найдите все числовые характеристики. В конце ещё раз посмотрите и подумайте. Не упустили ли вы чего-то.

Приведу пару примеров.

Предположим, вы располагаете номерами телефонов. Казалось бы, бесполезная информация. Но по номеру телефона можно много чего сказать. Можно узнать регион владельца номера, к какому оператору номер относится, частота оператора в регионе, относительный объём оператора и много чего ещё. Зная регион, можно добавить много параметров, характеризующих его в зависимости от решаемой вами задачи.
Если у вас есть информация об упаковке, то вы знаете её геометрические размеры. К геометрическим характеристикам относятся не только высота, ширина и глубина, но и их отношения — они тоже описывают габариты. Материал упаковки, разнообразие цветов, их яркость и много-много чего ещё.

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

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

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

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

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

Ну и наконец, не засоряйте пространство информационных признаков бессмысленными фичами. Это кажется противоречащим написанному выше, но есть нюанс — здравый смысл.
Если информация хоть как-то описывает объект — она полезна. Если вы просто взяли и попарно перемножили все фичи, то, скорее всего, никакого смысла вы не добавили, но возвели в квадрат размерность признакового пространства.
Иногда можно встретить совет попарно перемножать фичи. И это действительно может сработать, если у вас линейная модель. Таким образом вы добавите нелинейность и улучшите разделимость признакового пространства. Но современные алгоритмы, в особенности нейронные сети не нуждаются в таком искусственном и неосмысленном добавлении нелинейности.
Впрочем, если вы обладаете достаточным запасом вычислительной мощности, можете так сделать и проверить сами.

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

Наводим порядок в данных


image
Когда данные собраны, нужно навести в них порядок.

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

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

И наконец, посчитайте features importance. Делать это нужно по двум причинам.

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

Во-вторых, вам нужно найти самые важные признаки и проанализировать их.

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

image

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

TL; DR


Извлекайте все данные которые можно извлечь, но руководствуйтесь здравым смыслом.
Не пытайтесь включать эксперта, преждевременно удаляя признаки.
Используйте функциональные выражения от ваших информационных признаков, если они оправданы.
Удаляйте статистически не значимые переменные и переменные сильно коррелирующие с другими.
Сделайте диаграмму важности признаков. Возможно удалите самые не важные.
Изучите самые важные.
Если самые важные сильно выделяются на фоне остальных, изучите их особо пристально. Постройте графики распределений. Попытайтесь понять, почему они влияют так сильно. Подумайте над их удалением.
Если у вас есть возможность проверить вашу модель не только на тестовых, но и на реальных данных. Проверьте её сначала исключив подозрительно важные параметры, а затем включив их. И сравните результаты.

Приведённые здесь рекомендации зависят от того, какой алгоритм используется для построения модели. Я обычно использую нейронные сети. Эти рекомендации точно не подойдут вам, если вы используете логистические и линейные регрессии.

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

Объём статьи не позволяет затронуть все аспекты, но я постарался изложить основные моменты.
Большинство публикаций по машинному обучению ориентированы на описание алгоритмов. Но сбор и подготовка данных — это 95% работы по построению модели. Надеюсь, моя заметка поможет вам пореже наступать на грабли.

А какие методы улучшения качества моделей используете вы?
Автор — Валерий Дмитриев rotor

© Habrahabr.ru