MLClass
Компания
33,20
рейтинг
17 января 2015 в 12:45

Разработка → Искусство Feature Engineering в машинном обучении

Привет, хабр!



В предыдущей статье («Введение в машинное обучение с помощью Python и Scikit-Learn») мы с вами познакомились с основными этапами решения задач машинного обучения. Сегодня подробнее поговорим о техниках, которые позволяют заметно увеличить качество разрабатываемых алгоритмов. Одна из таких техник — Feature Engineering. Сразу отметим, что это своего рода искусство, обучиться которому можно только прорешав огромное количество задач. Тем не менее, с опытом вырабатываются некие общие подходы, которыми хотелось бы поделиться в данной статье.

Итак, как мы уже знаем, почти любая задача начинается с создания (Engineering) и отбора (Selection) признаков. Методы отбора признаков изучены достаточно хорошо и уже существует большое количество алгоритмов для этого (подробнее о них поговорим в следующий раз). А вот задача создания признаков является своего рода искусством и полностью ложится на плечи Data Scientist'а. Стоит отметить, что именно эта задача зачастую является самой сложной на практике и именно благодаря удачному отбору и созданию признаков получаются очень качественные алгоритмы. Зачастую на kaggle.com побеждают сами по себе простые алгоритмы с хорошо отобранными признаками (отличные примеры — Heritage Provider Network Health Prize или Feature Engineering and Classifier Ensemble for KDD Cup 2010)

Наверное, самый известный и понятный пример Feature Engineering многие из вас уже видели в курсе Andrew Ng. Пример заключался в следующем: с помощью линейных моделей прогнозируется цена дома в зависимости от множества признаков, среди которых есть такие, как длина дома и ширина. Линейная регрессия в данном случае прогнозирует цену дома, как линейную комбинацию ширины и длины. Но ведь любому здравому человеку понятно, что цена дома в первую очередь зависит от площади дома, которая никак не выражается через линейную комбинацию длины и ширины. Поэтому, качество алгоритма существенным образом увеличивается, если длину и ширину заметить на их произведение. Тем самым, мы получим новый признак, который наиболее сильно влияет на цену дома, а также сократим размерность признакового пространства. На мой взгляд, это самый простой и наглядный пример создания признаков. Заметим, что очень сложно придумать метод, который для любой наперед заданной задачи давал бы технику построения признаков. Именно поэтому пост и называется «Искусство Feature Engineering». Тем не менее, существует ряд простых методов и техник, которыми бы хотелось поделиться из собственного опыта:

Категориальные признаки


Допустим, у наших обьектов есть признаки, которые принимают значения на конечном наборе. Например, цвет (color), который может быть синим (blue), красным (red), зеленым (green), или его значение может быть неизвестно (unknown). В таком случае бывает полезным добавлять признаки вида is_red, is_blue, is_green, is_red_or_blue и другие возможные комбинации.

Даты и время


Если среди признаков есть дата или время — как правило, очень часто помогает добавлять признаки, соответствующие времени дня, количеству прошеднего времени с определенного момента, выделение сезонов, времен года, кварталов. Также помогает разделение времени на часы, минуты и секунды (если время дано в Unix-Time или ISO формате). Вариантов в данном месте масса, каждый из которых подбирается под конкретну задачу.

Числовые переменные


Если переменная вещественная, часто помогает ее округление или разделение на целую и вещественную часть (с последующей нормализацией). Или же, часто помогает приведение числового признака в категориальный. Например, если есть такой признак как масса, то можно ввести признаки вида «масса больше X», «масса от X до Y».

Обработка строковых признаков


Если есть признак, значением которого есть конечное количество строк — то стоит не забывать, что в самих строках зачастую содержится информация. Наглядным примером является задача Titanic: Machine Learning from Disaster, в которой имена участников плавания имели приставки «Mr.», «Mrs.» и «Miss.», по которым легко извлечь половой признак.

Результаты других алгоритмов


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

Агрегированные признаки


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

Добавление новых признаков


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

Итак, мы рассмотрели несколько техник создания (Engineering) признаков в задачах машинного обучения, которые могут помочь заметно увеличить качество существующих алгоритмов. В следующий раз мы подробнее поговорим о методах отбора (Selection) признаков. К счастью, там будет все проще, потому как для отбора признаков есть уже разработанные техники, в то время как создание признаков, как уже, наверное, заметил читатель, является искусством!
Автор: @akrot
MLClass
рейтинг 33,20
Компания прекратила активность на сайте

Комментарии (35)

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

    В духе, вот вам слабый feature space и random forest, а вот улучшенный feature space и какой-то нибудь rule learning и второй показывает на порядок лучшие результаты.
    • 0
      Спасибо за замечание — на будущее учту!
      Хорошие примеры есть в приложенных статьях, а также на форумах kaggle.com (чуть позже, если найду сходу ссылки — скину в комментарии)
  • +1
    Реквестирую статью по feature learning.
    • 0
      А что конкретно хотите?
      • 0
        Ну всего понемногу: текст, картинки, видео. Текст больше интересен.
        • +1
          Если рассказывать подробно — то по-немному не получится) Можно начать с текстов, по-возможности — напишу в следующий раз. Рекомендую пока обратить внимание на www.kaggle.com/c/word2vec-nlp-tutorial — там введение в bag of words и в word2vec. В текстах есть также богатый раздел — тематическое моделирование — про него, видимо уже позже придется писать отдельную статью
          • 0
            Было бы интересно. С word2vec я работал немного.
  • 0
    За статью спасибо, но в наше стремительное время уже устарело. В Америке семимильными шагами шагает deep learning, больцмановские машины и прочие unsupervised learning. Вкратце — способ извлечь из любых данных некие паттерны — фичи, а далее из этих фич еще более общие фичи. В результате такая глубокая нейронная сеть автоматически извлекает фичи и уже когда данные таким образом обработаны и в них известны «что к чему» можно добавить подписи и получить классификатор. Описание упрощено, все совпадения с реальными именами случайны :-) Давайте догонять запад! А то сейчас у них пошла волна, что будет дип лернииг и все остальное — убыточное(не личное мнение) HTTP и вокруг! Далее раскручивайте сами:

    www.youtube.com/watch?v=AyzOUbkUf3M
    • +5
      Deep Learning — это немного другое, если пользоваться похожими терминами — это Feature Extraction — извлечение признаков из обьектов, именно поэтому Deep Learning в настоящее время применяется в основном в обработке изображений, видео или текстов. В тоже время существует огромное количество задач, где признаки уже есть и Deep Learning просто не нужен. Кстати, отличная идея — надо будет написать про Deep Learning, спасибо!
      • 0
        Ну тут условно. Мое понимание — фичи которые «видны и так» это хорошо, их можно использовать. Но прикол в том, что наш мозг настроен определенным образом и то, что ему видно ограниченно. Те банально у мозга есть весьма ограниченные способности увидеть взаимосвязи в финансовых данных, к примеру. Так вот если есть достаточный объем данных, то deep learning извлечет и то, что «видно и так» и гараздо больше. Очень забористая штука. Сорри, за стиль комментария. Автор вчера ушел в отпуск и отпраздновал это бутылкой пива. Так-что что хочу сказать, в сухом остатке у вас, или мало данных, или you loose. Только RBM, только хардкор!
        • 0
          Мне к сожалению известно не так много практических примеров применения Deep Learning, за исключением тех, что я назвал. Если есть примеры, отличные от перечисленных — дайте знать!
        • 0
          Хм, кажется, RBM хорошо работают тогда, когда данные можно представить в бинарном виде(например, изображения), но для общего случая, когда мы имеем дело с вещественными данными, вроде как вопрос открыт на тему хорошего алгоритма обучения?
          • 0
            Есть Гаусиан-Бернулли RBM
      • +3
        По мне, зря человека заминусили. Я не помню чтоб на nips/icml встречал доклады от российских вузов. Правда, русских имен много.
        На счет Feature Learning / Deep learning это все очень тесно связано.

        За последние два года я работал только с deep learning алгоритмами, а классику использовал только для сравнения.

        В широком смысле, текст, изображения и видео — это 90% современного машинного обучения.

        Вот список приложений в более узком смысле:
        — автоматический перевод
        — распознавание речи
        — определения жанра музыки
        — распознование рукописных символов (именно, handwriting)
        — моделирование длинных последовательностей: языковые модели, трейдинг
        — автоматическое аннотирование картинок
        — IR: поиск картинок, документов
        — рекоммендательные системы
        — пара приложений от deepmind, которую гугл купил:
        — ИИ для простых видеоигр
        — neural turing machine: инференс простых алгоритмов, вроде сортировки; но это пока очень экспериментальная штука

        • 0
          Спасибо!

          >За последние два года я работал только с deep learning алгоритмами, а классику использовал только для >сравнения.

          А можно какие-либо подробности узнать? Интересно пообщаться, я с DL сталкиваюсь не так часто по роду работы, очень хотелось бы узнать подходы к решениям прикладных задач. Можно в личку)
          • +1
            Делал такие штуки с дип ленингом:

            — распознавание объектов на спутниковых снимках
            — word2vec хорошо сработал для рекомендательной системы для соцсетей
            — определение тональности текста: здесь сложней, большого выигрыша не получил, но дизайн фич упростился
            — мой личный долгострой — система распознавание речи: пробовал разнные модели, что-то работало, что-то нет. но deep learning тут уже state of the art.

            Пообщатся можно, пишите в личку, я верну скайп.
            • +1
              word2vec хорошо сработал для рекомендательной системы для соцсетей
              Вот про это было бы интересно узнать подробнее. Может статью напишете? Правильно ли я понимаю, что Вы ориентировались на статью Neural Word Embeddings as Implicit Matrix Factorization?

              Ну и организацонные вопросы:
              — Какие (даже, в каком количестве) вычислительные мощности исползовались?
              — Какие данные использовали, как много их было?
              • +1
                Да, я хотел бы написать. Будет время, сделаю. Там частично NDA ограничивает, но материала хватит.

                На счет той статьи что вы привели, когда я пробовал word2vec, она еще не появилась. Но статья хорошая, проливает немного света на весь этот шаманизм.

                По огранизационным вопросам. word2vec хорошо оптимизирован, так что там достаточно машинки с хорошим cpu и большой памятью чтоб рассчитать до 10 гигабайт текста. Я считал в основном на 2-6 гб текста википедии. Также делал свою версию word2vec и paragraph vector на GPU. Также хватало одной машины с хорошей картой.

                Что касается картинок, то там ситуация сложней. Там была задача посчитать все машины в определенных областях сша за несколько лет. Для тренировки я использовал 1-3 машины, но в продакшне был кластер из 60 GPU.
                • 0
                  А для речи какие данные используете?
    • +2
      Вы сильно переоцениваете как возможности, так и область применения глубокого обучения. Если вы, например, захотите посчитать, за сколько можно продать вашу машину (описанную, скажем, 20-ю признаками), то и сеть сильно глубокую вы не построите, и какие-то особенные паттерны в данных вы вряд ли увидите. А вот обычная линейная регрессия с парой трюков и ручного feature engineering наверняка покажет отличный результат.

      Я бы сказал, что есть как минимум 2 обязательные предпосылки для DL:

      1. У вас много (больше 100, а лучше больше пары тысяч) признаков.
      2. Паттерны в данных сильно нелинейные.

      В остальных случаях DL (равно как и более базовые автокодировшики и ограниченные машины Больцмана) вряд ли будут сильно полезны. По крайней мере не много полезней классических регрессий, SVM и PCA.
      • 0
        Да, именно об этом и была речь выше. Собственно, насколько мне известно (могу ошибаться) DL как раз и появилось там, где сложно было придумать признаки «из головы» — т.е. в картинках, видео, аудио и тексте (хотя в последнем случае DL далеко не всегда дает лучшие результаты по сравнению с тем же bag of words)
        • 0
          Признаки признакам рознь. RBM/AE, по сути, задают нелинейную функцию уменьшения размерности пространства. То, что на выходе получаются высокоуровневые признаки, которые, в некоторых случаях, могут быть интерпретированы человеком (например, дуги на изображениях) — это своего рода побочный эффект. Ручные признаки, с другой стороны, являются непосредственными функциями от наблюдаемого объекта. Например, алгоритм машинного обучения может выделить части лица на фотографии, но он не сможет сделать сам снимок, равно как и не сможет узнать имя, профессию и прочие данные о человеке.

          Текст — это как раз очень хороший пример, показывающий разницу между нелинейной трансформацией и «придумыванием» признаков. Текст, по сути, — это просто набор символов. Человек может решить, какие признаки из него извлекать: слова, пары слов, леммы, части речи, знаки препинания и т.д. А какая-нибудь RBM может только взять такие подготовленные человеком признаки и определить, что слова «галактика» и «джедай» указывают на одну и ту же тему, а глаголы часто следуют за существительными. Но как-то осмысленно разобрать изначальный поток символов для неё будет тяжеловато.

          Кстати, ключевой особенностью глубоких сетей при распознавании изображений является операция свёртки (без неё алгоритм предобучения искал бы паттерны на всём изображении, а не только на локальной области), т.е. вполне себе ручная операция :)
          • 0
            Например, алгоритм машинного обучения может выделить части лица на фотографии, но он не сможет сделать сам снимок, равно как и не сможет узнать имя, профессию и прочие данные о человеке.
            Эээ, такие «ручные признаки» будут очевидно богаче Deep Learning'овых в плане количества содержащейся в них информации, посему как-то не очень хорошо эти понятия сравнивать. Так, знаете ли, и правильный ответ можно (target) можно в признаки включить, а потом обойтись тривиальным решающим правилом.

            Свертка есть признак, как и свёрточные сети в целом. На них можно смотреть как на достаточно общие признаки (ручные, да) для большинства изображений (и других данный сигнальной природы).
            • 0
              Так, знаете ли, и правильный ответ можно (target) можно в признаки включить, а потом обойтись тривиальным решающим правилом.

              Смотря что вы пытаетесь сделать. Если вы пытаетесь предсказать, сможет ли человек вернуть кредит, то вы без проблем узнаете его профессию, семейное положение и т.д., но вероятность возврата кредита — т.е. «правильный ответ» — всё равно останется зависимой переменной, которую нужно вычислить.

              Вообще, мне в последнее время думается, что определение «извлечение (или изучение) признаков» — это плохой термин для описания того, что делают AE и RBM. Признак, или, в терминах статистики, переменная — это по определению функция из множеста исходов (outcomes) в некоторое измеримое множество (обычно в множество чисел). Исход — это, например, человек в банке или какой-то конкретный текст. Алгоритмы глубокого обучения не работают с исходами как таковыми, они работают уже с какими-то готовыми переменными. При этом всё, что они делают — это переводят эти переменные в другое пространство, поэтому правильнее было бы назвать их алгоритмами преобразовани признаков, а не их извлечения.
              • 0
                Я, конечно же, в первую очередь имет в виду задачи обучения с учителем. И тут уж если один из признаков идеально кореллирует с ответом, то надо его вычислять или нет — дело десятое, а пользы от алгоритма, обученного на таком датасете — ноль.

                Про преобразование признаков согласен. С другой стороны, настоящее изучение признаков о рассматриваемой сущности (например, человеке в задаче кредитного скоринга) машиной, мне кажется, потребует сильного ИИ, поскольку надо будет знать, какими признаками сущность может обладать, иметь какую-то (физическую) модель решаемой задачи чтобы отличать потенциально релевантные признаки (ведь цвет носков бабушки заёмщика не имеет никакого значения в этой задаче), а потом ещё пойти и как-то их достать, сохранив при этом задачу осмысленной (а не так, что сказать «для предсказания вероятности возвращения кредита мне нужна банковская история этого человека на 5 лет вперёд» или «для предсказания цены квартиры мне нужно знать среднюю цену в радиусе 1м»)
              • 0
                >При этом всё, что они делают — это переводят эти переменные в другое пространство, поэтому >правильнее было бы назвать их алгоритмами преобразовани признаков, а не их извлечения.

                Вот это абсолютно верно, причем как вы уже сказали — большинство операций, особенно свертка — ручные. DL переоценен — тут нет сомнений)
      • 0
        Это вы сильно переоциениваете то, что я переоцениваю. Я говорю только, что автоматическая экстракция фич уже сегодня. То, что на практике все не так однозначно — понятно. Важно, что deep learning сильно отличается от 1. придумай фичи 2. запусти PCA. Как по мне это уже следующий шаг к АИ. Свертки это конечно такие же придумывания фич, но это опять же в моем понимании мера оптимизации. В любом случае мне по барабану. Я не за что не агитирую. Я позитивный человек. Больше знаешь алгоритмов, больше можешь использовать — лучше. Цель поста только обратить внимание, что в западной прессе огромный хайп на эту тему. Вот люди так же тратят время на бессмысленное перемывание косточек www.quora.com/Will-deep-learning-make-other-Machine-Learning-algorithms-obsolete
      • +1
        И давно вам встречались задачи с 20 признаками и линейными паттерннами? Я лет пять занимаюсь ML для разных стартапов — и все задачи были 1) большой размерности 2) с высоко нелинейными паттернами 3) высоким шумом / избыточностью.
    • +2
      А есть примеры применения Deep Learning вне аудио, видео, картинок и текста? Я вижу все эти области как характеризующиеся тем, что у них есть иерархическая скрутура, когда из низкоуровневыевых признаков собираются высокоуровневые (например, машина «собирается» из колёс, дверей и корпуса, которые, в свою очередь, собираются из различной причудливости контуров).

      В задачах же, вроде оценки стомости дома, кажется, просто нет такой иерархической структуры, что сводит на нет все плюсы DL.
      • 0
        Ну почему же нет структуры, везде есть набор скрытых взаимоотношений заложенных в цену. И везде они добавляют что-то в цену. Если иметь очень большое количество домов уже можно выяснить «течет ли душ в данном доме» потому-что владелец сбавляет всегда цену на 2$ условно. А из этого можно выяснить, что там есть горячая вода, к примеру. Просто для этого не будет названий. Иерархичность в данном случае просто от более простых к более сложным признакам. И вопрос только в том со скольких домов есть данные. Я не супер-большой эксперт, только учусь и с вами спорить не буду
      • 0
        Эти области еще отличает и то, что в них сами признаки очень сложно придумать. В Computer Vision задачах по-сути большинство методов (особенно в задачах классификации) все, что делают — это описывают грамотный способ извлечь признаки, а потом применяется простой классификатор, вроде SVM или лог-регрессии. Отсюда и появились такие вещи, как градиенты, дескрипторы и прочие признаки, извлекаемые из изображений. А вот DL в подходе к картинкам как раз и обладает тем преимуществам, что не почти не приходится думать над признаками
        • 0
          А что Вы понимаете под признаками? Никто не мешает взять сырые данные (пиксели, например) в качестве признаков. Другое дело, что (в большинстве случаев) осмысленности в таких признаках нет, ибо не было никакой попытки преодолеть "семантический разрыв". С другой стороны, с небольшой предобработкой (вроде нормализации контраста, выделения региона для классификации, бинаризации) для некоторых задач (MNIST, например) даже такие признаки сгодятся для получения «положительного» качества.

          Для натуральных (естественных) изображений вроде фотографий всё, конечно, гораздо сложнее. И тут, да, методы DL пока что являются State of the Art.
          • 0
            Да, я как раз имел ввиду, что пиксели почти нигде не используются. Простые преобразования, вроде тех, что вы перечислили в простых задачах дают довольно неплохой результат. Но если рассмотреть задачи, даже, скажем классификацию изображений, где классов несколько тысяч или задачу детектирования углов или распознавания движения обьекта на видео — тут надо либо изобретать нетривиальные признаки (которые можно найти потом в статьях), либо (особенно в многоклассовой классификации) использовать DL
  • +1
    Опечатка в названии может затруднить поиск статьи
    • 0
      Спасибо, поправил)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка