habrahabr

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

  • воскресенье, 18 января 2015 г. в 02:11:11
http://habrahabr.ru/post/248129/

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



В предыдущей статье (Введение в машинное обучение с помощью 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) признаков. К счастью, там будет все проще, потому как для отбора признаков есть уже разработанные техники, в то время как создание признаков, как уже, наверное, заметил читатель, является искусством!