Особенности Engineering: за кулисами алгоритмов машинного обучения

Большинство людей (включая меня) склонны думать, что основная деятельность по созданию алгоритма машинного обучения, несомненно, заключается в построении самого алгоритма. Конкретно это означает работу с реальными данными, определение их структуры и прогнозирование. Что ж, из опроса, проведенного несколько лет назад, выяснилось, что специалисты по данным обычно тратят 80% своего времени на проверку, очистку и систематизацию своих данных, а только оставшиеся 20% посвящают созданию реального алгоритма. Эту ситуацию, известную как правило 80/20, сегодня предполагается нарушить для повышения эффективности, но подготовка данных по-прежнему составляет более половины работы.

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

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

Итак, давайте начнем с некоторых стратегий:

  • Функции должны быть связаны с целью. Искусство обобщения релевантной информации также играет важную роль в науке о данных. Было бы контрпродуктивно сохранять избыточные или бессмысленные функции в нашей модели: они сделали бы ее слишком сложной и тяжелой для обучения. Конечно, то, что делает функцию актуальной, - это ее относительная цель. А именно, допустим, мы хотим построить модель, которая прогнозирует вероятность наличия определенного заболевания. У нас есть тысячи медицинских карт пациентов, но нужны ли они нам все? Если нас интересуют заболевания легких, мы не будем смотреть на сканирование RMI коленного сустава… но если мы ищем некоторые индикаторы ожирения, это может стать актуальным.
  • Функции должны быть известны во время прогноза. Это может показаться очевидным, но часто бывает, что при сборе данных мы забываем, что прогнозы будут разработаны во второй момент, поэтому мы должны убедиться, что собранные данные будут доступны и в это время. Рассмотрим следующий пример: вы хотите построить модель, которая прогнозирует дивиденды, которые ваша компания будет выплачивать своим акционерам. Вы будете использовать в качестве функций количество сотрудников, количество часов, потраченных на работу, и прибыль по последнему балансу. Если время прогноза приходится на конец года, вам повезло, поскольку прибыль вашей компании будет опубликована вместе с ее балансом. Однако, если вы захотите повторить свой анализ через 6 месяцев, у вас будет только 2 функции из 3, поскольку прибыль в это время будет недоступна.
  • Функции должны быть числовыми и иметь значимый размер. Если мы подумаем о любом алгоритме, становится ясно, что это математические модели и, как таковые, они состоят из серии математических операций. Следовательно, они не смогут обучаться функциям, которые не являются числовыми. Это не означает, что категориальные функции нельзя использовать в обучении: просто их нужно будет преобразовать с помощью процесса, называемого горячим кодированием, который я объясню позже. Кроме того, они должны иметь соответствующую величину: это означает, что если одно наблюдение показывает значение 1, а другое - значение 2, последнее в два раза важнее (или больше), чем первое. Если мы подумаем о некоторых переменных, таких как идентификаторы заказов, мы поймем, что они числовые, но не имеют значимой величины (если у заказа есть идентификатор 120, это не значит, что он вдвое важнее, чем заказ с идентификатором. равно 60).
  • У функций должно быть достаточно примеров. Идея состоит в том, что, если функции имеют тенденцию быть плохо отсортированными и несбалансированными, тогда наш алгоритм будет предвзятым. Представьте, что мы хотим предсказать по картинке, какие фрукты мы смотрим: среди наших функций мы выбрали «цвет», но оказывается, что эта функция показывает только «зеленые» значения. Модель не сможет обобщить свой прогноз после применения к новым данным, поэтому мы предпочли бы исключить эту функцию из нашего анализа.

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

Теперь давайте посмотрим, как изменились ваши функции.

  • Ввод значений. При сборе данных может случиться так, что некоторые значения будут пропущены. В этом случае вы можете либо удалить все записи, которые показывают одно или несколько значений NA, либо ввести некоторые новые релевантные значения. Первый подход может заключаться в замене их средним или медианным значением признака. Обратите внимание, что иногда может возникнуть тривиальная ситуация: если вы сталкиваетесь с функцией с двоичными значениями 0–1, возможно, что, если значения недоступны, они будут представлены с нулевым значением. фактическое значение, а не как пропущенное значение. Итак, в этом случае хорошим подходом является создание нового столбца (опять же, столбца 0–1), где 1 означает, что значение предыдущего столбца доступно, а 0 означает, что это не так.
  • Работа с категориальными ценностями. Как и ожидалось, мы не можем кормить наш алгоритм без числовых значений. Однако приписывание им числовых классов тоже может быть бесполезным, если они не имеют значимой величины.

У нас есть функция под названием «Цвет», в которой представлены три элемента: зеленый, желтый и красный. Эти значения категоричны, и мы могли бы решить закодировать их как 1, 2 и 3. Однако это было бы бессмысленно, поскольку неверно, что желтый цвет (равный 2) вдвое больше зеленого (равен 1). В качестве альтернативы мы можем использовать то, что я упомянул выше, горячую кодировку:

Таким образом, мы создаем три новых столбца, и теперь каждое значение представлено вектором, где позиция числа 1 является индикатором типа значений. Между [1 0 0] и [0 1 0] нет иерархической связи.

  • Обработка выбросов. Выбросы - это значения, далекие от среднего. Они могут быть одномерными (когда наблюдение представляет собой аномальное значение только для одной функции) или многомерными (когда несколько характеристик этого наблюдения далеки от среднего). Первый шаг, который вы можете предпринять для выявления выбросов, - это визуализировать ваши данные: диаграммы, диаграммы рассеяния и гистограммы - полезные инструменты для этого. Немного более сложным может быть вопрос о причине этого аномального значения, поскольку это информация, которая вам нужна, если вам нужно решить, сохранить или удалить выброс. Действительно, аномалия может быть вызвана ошибкой при сборе данных. А именно, если вы собрали некоторые физические характеристики мужчин, работающих в компании X, и заметили в своем «росте» значение 7 метров… что ж, вы можете предположить, что это ошибка. С другой стороны, если ваше наблюдение демонстрирует подлинную аномалию, вам может быть интересно сохранить эту информацию, чтобы модель могла включить ее и обнаружить будущие аномалии. Некоторые методы, которые вы можете использовать, - это преобразование журнала (чтобы уменьшить дисперсию и не подорвать вашу модель) или, что более сложно, вы можете извлечь все выбросы и построить на них конкретную модель.
  • Крестики с признаками. Этот метод немного менее интуитивен, чем предыдущие, но он невероятно эффективен для сбора и обобщения важной информации. Идея крестов функций заключается в том, что из существующих переменных мы можем создавать новые функции (как преобразование существующих функций), которые содержат гораздо больше информации и, в частности, информацию, которая более актуальна для задачи. Давайте представим это на примере:

В такой ситуации мы можем легко разделить линейно два наших кластера (примечание: когда я говорю «линейно разделимый», я имею в виду, что существует линейная комбинация двух моих функций, которая хорошо разделяет мои классы). Теперь рассмотрим следующее:

Здесь невозможно найти такую ​​линейную комбинацию x1 и x2, чтобы синие и красные точки были разделены. Но что произойдет, если ввести новые функции x3, определяемые произведением x1 и x2? Что ж, теперь мы можем определить правило, которое может разделять наши классы. Как? Посмотри на это:

Мы можем заключить, что если знак x3 положительный (значит, x1 и x2 имеют одинаковый знак), класс синий, тогда как если знак x3 отрицательный (поэтому x1 и x2 имеют разные знаки), класс красный.

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

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

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

Первоначально опубликовано на http://datasciencechalktalk.com 1 августа 2019 г.