Пример Feature Engineering в машинном обучении

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



    В одной из прошлых статей мы познакомились с таким понятием как Feature Engineering и применением его на практике. В комментариях было озвучено пожелание показать на примере, как искусство генерации признаков помогает заметно улучшить качество алгоритмов машинного обучения. Я поискал задачи, в которых бы это можно было наглядно продемонстрировать и нашел один хороший пример. Это задача Forest Cover Type Prediction. Покажем, как можно применяя простые идеи, не содержащие в себе машинное обучение, сразу попасть в топ 10% Leader Board!

    Не будем подробно описывать условие задачи, желающие могут ознакомиться с ним на странице соревнования. Отдалившись от предметной области, скажем лишь, что решается классическая задача многоклассовой классификации обьектов. Не будем в данном месте также приводить простые решения, которые сразу приходят в голову — запуск стандартных алгоритмов на всем множестве признаков или с предварительным отбором последних — все это дает сразу точность (Accuracy) не более 0.6-0.7

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



    Как видим, признаки имеют довольно разные распределения (о физическом их смысле предлагается порассуждать читателю), однако, можно заметить один интересный момент — у признака Vertical_Distance_To_Hydrology один из хвостов выходит за значение 0. Таким образом, вспоминая обзор по Feature Engineering напрашивается ввести новый бинарный признак, который будет равен значению логического выражения [Vertical_Distance_To_Hydrology < 0]

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

    Понятно, что если имеются такие признаки, как Horizontal_Distance_To_Hydrology и Vertical_Distance_To_Hydrology, то первое, что напрашивается — это просто посчитать расстояние — корень из суммы квадратов и записать это как новый признак Distanse_to_Hydrolody

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

    Horizontal_Distance_To_Hydrology
    Horizontal_Distance_To_Roadways
    Horizontal_Distance_To_Fire_Points

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

    А теперь самое интересное и наглядное, из-за чего я выбрал эту задачу. Такое бывает достаточно редко и найти это можно, только долго вглядываясь в данные. Но, заметив неочевидную закономерность, можно существенно увеличить качество алгоритма. Посмотрим внимательно на зависимость Elevation от Vertical_Distance_To_Hydrology:



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

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

    Чтобы не отнимать у читателя интерес к этой задаче, остановимся на поиске новых неочевидных закономерностей, которые в ней присутствуют. Используя только приведенные признаки, и строя них ансамбль из случайных деревьев, можно получить качество (Accuracy) близкое к 0.8. Этим примером я хотел показать, как зачастую на практике бывает полезно просто посмотреть на данные, прежде чем применять сложные алгоритмы, оптимизировать параметры и писать код!
    MLClass 32,61
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 23
    • +2
      Правильно ли я понял, что методы оптимизации являются как бы «базой» для алгоритмов машинного обучения? Судя по алгоритмам регресии, например, с их градиентным спуском, получается, что так.
      • +2
        В некотором смысле так и есть. Так или иначе большинство алгоритмов сводятся к задаче оптимизации, будь то svm, лог-регрессия, персептрон, k-means и другие.

        Например, нейронные сети — backpropagation — это в некотором смысле простой способ эффективно вычислять градиент и не более того
        • +2
          Добавлю, если позволите.

          Классическая постановка задачи машинного обучения ставится так.
          Есть обучающая выборка как эталонное поведение объекта.
          По-человечески говоря, это примеры состояний, и соответствующие результаты, которые для них выдаёт моделируемый объект.
          Не очень по-человечески получилось… :)
          То есть, при таких-то заданных исходных значениях должен получаться такой-то результат.

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

          Мера близости требуемого поведения задаётся функцией потерь и другими вариациями на эту тему, которые показывают насколько смоделированное поведение отклоняется от заданного.
          Поэтому алгоритмы обучения, как правило, сводятся к поиску оптимального решения, минимизирующего значение функции потерь.
          Одной из гипотез, позволяющих это сделать, является гипотеза о компактности пространства решений, в котором можно постепенно двигаться и улучшать решение.
          • 0
            Спасибо за развернутый комментарий, очень интересно)
            • +2
              Если интересно, то я очень рекомендую посмотреть превосходные видеолекции Воронцова в ШАД.
              По моему скромному мнению это один из лучших вводных курсов в машинное обучение — интереснее, чем у Ng.
              Много объяснений механики алгоритмов и всё это не «зубодробительно-наукообразно».
              Оптимизация, насколько я понимаю, это как раз направление научных разработок Воронцова.

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

              Кроме того, есть печатные материалы к этому курсу в pdfах.
              Много полезного лежит здесь MachineLearning.ru

              От себя добавлю — это на самом деле интересная штука :)

              P.S. Почему-то не видны ссылки, хотя в исходном коде поста они есть.
              Может потому что я отхабренный? :)
              Попробую повторить их просто текстом по порядку
              shad.yandex.ru/lectures/machine_learning.xml
              shad.yandex.ru/lectures/machine_learning_13.xml
              www.machinelearning.ru/
              • 0
                Ага, о лекциях Воронцова знаю, всё собираюсь посмотреть, но опасаюсь, что будет трудновато усвоить материал :) За ссылки — спасибо :)
                • +1
                  Если вдруг в процессе почувствуете, что где-то не хватает знаний теории вероятностей и математической статистики, возьмите книги Вентцель.
                  Или ещё сам Воронцов рекомендует прочесть М.Б.Лагутин «Наглядная математическая статистика».
                  В сети это всё есть.
                  Если понадобится, но не найдёте, напишите мне, я пришлю.
                  • +1
                    Я слушал и проходил все из вышеперечисленного в свое время. Курсы, это конечно хорошо, но при решении задач на практике возникают совсем другие трудности. Поэтому, я бы рекомендовал сделать следующее:

                    1. Начать решать задачи на kaggle.com, активно читая форум и все Tutorial's, которые там есть — там все максимально лояльно к новичкам

                    2. Параллельно пройти курс Andrew Ng — этого курса почти заведомо хватит для решения задач

                    Дальше уже можно смотреть дополнительные материалы, вроде лекций Воронцова и глубже вникать во всю математику
                    • 0
                      Спасибо огромное вам обоим :) Kaggle у меня, правда, вызывает страх и непонимание, как начать. Видимо, надо было начать с Tutorial'ов.
                      • +1
                        Согласен абсолютно с рекомендациями — теория без практики мертва.
                        Надо брать python и играть с данными.

                        Мне показалось, что коллега интересуется общими принципами работы машинного обучения.
                        Ведь для того же FE хорошо бы знать как оно там внутри устроено, чтобы понимать почему один признак хорошо делит классы, а другой кое-как.
                        Или например почему стоит делать бинаризацию.
                        Или почему один метод с данным набором признаков работает средненько, а другой блестяще.
                        Мне показалось, что лекции ШАДа очень хорошо совмещают классическую математическую школу с практическими особенностями алгоритмов в применении.
                        • 0
                          Вы, в целом, правы. Лекции Andrew Ng я уже смотрел, что-то на Хабре читал, но хочется гораздо более глубокого понимания — что же там «под капотом».
          • +1
            Похоже, что feature engineering — это способ свернуть линейное пространство признаков в такое хитрое гиперпространство, в котором разделяющая поверхность действительно выглядит как плоскость.
            А вот вопрос: Вы используете какой-нибудь системный подход при выделении новых признаков? За исключением полного перебора и метода «научного тыка»?
            Графики разные наверно сильно помогают?
            • +1
              >Похоже, что feature engineering — это способ свернуть линейное пространство признаков в такое хитрое гиперпространство, в котором разделяющая поверхность действительно выглядит как плоскость.

              Вовсе не обязательно, главное — увидеть эту разделяющую поверхность. Не факт, что потом будет какое-то преобразование, которое переведет эту поверхность в плоскость

              Нет, подхода тут нет, это как раз искусство и приобретается с опытом, можно только выделить какие-то общие рекомендации, но как правило от задачи к задаче они меняются. Некие общие рекомендации я описывал тут habrahabr.ru/post/248129/
              • 0
                Спасибо за ответ. Жду продолжения цикла!
                • 0
                  А что вам интересно узнать нового?
                  • 0
                    Ну вот например: Твиттер недавно выпустил фреймворк для поиска аномального поведения своей инфраструктуры. Интересно, как это работает, и как построить похожую систему на основе sklearn.
                    • 0
                      Там по вашей ссылке как раз написано, что за алгоритм лежит в основе. Начать рекомендую с раздела Anomaly Detection в курсе Andrew Ng (Coursera) — там рассказан основной (но далеко не единственный) подход к этой задаче
            • 0
              Чтобы вычитать из одного признака другой, их нужно сначала пронормировать. Какой тип нормировки использовался в вашем подходе?
              • 0
                >Чтобы вычитать из одного признака другой, их нужно сначала пронормировать.
                Зачем? У нас есть 2 проекции некоторого расстояния, мы хотим добавить признак, который равен расстоянию. Не очень понятно, зачем тут что-то нормировать. Нормировка обычно используется в градиентных методах, где признаки уже заданы и никаких преобразований с ними уже не производится
              • +1
                1) Не совсем очевидно, почему нужно брать разницу между Elevation и Vertical_Distance_To_Hydrology.
                2) Что означает цвет на втором графике?

                Спасибо.
                • 0
                  1. Разница (надо в статье поправить — с точностью до множителя перед вычитаемыми величинами) как раз и задает разделяющие прямые, которые видны из графика
                  2. Цвет — это классы наших обьектов, как дано в задаче. В этом и есть смысл графика, показать, что точки разных цветов разделяются на таком графике
                • 0
                  Наверно все же стоило упомянуть, что эта статья — пересказ туториала с форума www.kaggle.com/c/forest-cover-type-prediction/forums/t/10693/features-engineering-benchmark/56606#post56606
                  • 0
                    Честно скажу — этот туториал я не смотрел, а на задачу обратил мое внимание знакомый. После я посмотрел на выборку и увидел эти закономерности — рассказал о них своему приятелю, который подтвердил, что это срабатывает и дает заявленное качество. Посылок в систему я не делал

                    Мельком проглядев туториал, вижу, что в том там есть гораздо более крутые и неочевидные закономерности, чем описаные тут. Спасибо за ссылку!

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

                  Самое читаемое