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