Привет! Меня зовут Дмитрий Тимохин, и я являюсь одним из разработчиков библиотеки Autobinary. Ранее, вместе с коллегами из команды «Модели управления Жизненным Циклом Клиента», мы рассказывали вам о кросс‑валидации в autobinary. Сейчас я остановлюсь на том, как можно извлекать только информативные факторы, используя популярные методы отбора совместно с кросс‑валидацией.

P. S. Features в разных статьях могут называться немного по‑разному: факторы, фичи, признаки.

Отбор факторов

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

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

Однофакторный и многофакторный анализ, первичный отбор факторов

Перед обработкой факторов и разделением генеральной совокупности данных на обучающее, тестовое и валидационное множества, мы обрабатываем ошибки в факторах и проверяем их на количество пропусков. Таким образом для проверки факторов на пропуски, применяется класс NansAnalysis (рис. 1), в который подаем генеральную совокупность данных. Данный класс включает в себя две функции to_types и fit. В первую передается список количественных переменных для обработки бесконечных значений и приведением к типу float, во второй обозначается порог доли пропусков, при котором факторы будут исключены из дальнейшего анализа.

Рисунок 1. Анализ пропусков

После обработки факторов на ошибки, проверки на пропуски и разделением генеральной совокупности данных на обучающее, тестовое и валидационное множества, начинается первичный отбор факторов на обучающем множестве. Класс необходимый для его проведения является PrimarySelection (рис. 2), на вход которого подаются обучающее множество, пайплайн предобработки факторов, о котором было рассказано в предыдущей части статьи об Autobinary, списки с названиями количественных и категориальных переменных, название столбца с целевой переменной, тип модели, а также тип решаемой задачи.

Рисунок 2. Инициализация класса первичного отбора факторов

Данный класс позволяет применить следующие методы:

1. Корреляционный анализ — corr_analysis (рис. 3). На вход функции передается метод расчета корреляции «spearman» / «pearson» — стоит понимать распределения факторов, для использования того или иного метода, threshold — пород при котором факторы являются коррелирующими и флаг исключения факторов. Во время расчета корреляции, также происходит расчет метрики по каждому фактору его разделяющей способности относительно целевой переменной, флаг drop_with_most_correlation говорит о том, что при значении True исключаются те факторы, которые чаще всего коррелировали с остальными, при значении False исключаются факторы имеющие худшую разделяющую и объясняющую способности, т. е. если признак коррелирует еще с n‑количеством признаков, но является более значимым по метрике gini / r2, из анализа будут исключатся его пары с наименьшим значением по метрике.

Рисунок 3. Корреляционный анализ факторов

2. Анализ значимости факторов относительно глубины алгоритма — depth_analysis (рис. 4). На вход функции подаются список признаков, которые будут рассмотрены и максимальное значение глубины, до которого будет обучаться алгоритм. Таким образом получаются значимости факторов на глубине 1, 2, 3… n, значимости факторов усредняются и исключаются те, значение которых в среднем было равно 0. Также на каждой из глубин проставляется ранг фактора, значение значимости которого было больше 0, и после всего обучения рассчитывается средний ранг фактора относительно всех глубин алгоритма.

Рисунок 4. Анализ значимости факторов относительно глубины алгоритма

3. Анализ перемешивания факторов после применения обученного алгоритма — permutation_analysis (рис. 5–7). На вход функции передается список факторов, которые будут рассмотрены, стратегия разделения обучающего множества для обучения и проверки факторов при перемешивании, количество перемешиваний, библиотека Permutation Importance (sklearn / eli5 / kib), количество ядер, метрика для проверки и направленность метрики. На момент инициализации класса PrimarySelection создается признак из случайно сгенерированных чисел размерности равным размеру обучающего множества (random_feature). Данный признак необходим для отбора факторов в методе Permutation Importance. Как этот метод работает? Все довольно просто, на списке факторов, полученных с предыдущих этапов, происходит обучение алгоритма и запоминается значение метрики на оригинальном пространстве признаков. Далее алгоритм применяется на множестве, в котором каждый фактор перемешивается случайным образом отдельно от остальных и происходит сравнение значения метрики на полученном множестве относительно оригинального. Если метрики сильно ухудшается — фактор является значимым, если почти не меняется или меняется в лучшую сторону — то стоит исключить данный фактор из анализа. Пороговым значением отбора здесь и является значение метрики при перемешивании случайно сгенерированного фактора, т. е. если при перемешивании случайного признака метрика ухудшилась сильнее, чем при рассматриваемом признаке — то данный признак приравнивается к шумному. Средний список факторов формируется функцией select_features в классе PrimarySelection.

Рисунок 5. Permuataion Importance анализ
Рисунок 6. Визуализация Permutation Importance анализа
Рисунок 7. Отбор факторов после Permutation Importance

Класс PrimarySelection используется перед основным блоком обучения алгоритма, так как позволяет сократить признаковое пространство в несколько раз, тем самым сокращая потребляемые мощности при кросс‑валидационным обучением и подборе гиперпараметров. По опыту применения в практике, с помощью PrimarySelection удается сократить длинный список факторов до среднего с ~2500 до ~500, имеющих влияние выше случайного шума.

Все отобрали, куда дальше?

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

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

Рисунок 8. Инициализация класса AutoSelection

Данный класс содержит в себе несколько методов отбора при контроле качества обучения, а именно:

  • Forward selection;

  • Backward selection;

  • Deep backward selection.

Перед перебором факторов, класс AutoSelection повторяет кросс‑валидационное обучение, наследуя класс AutoTrees, запоминает среднее значение метрики и список со средними значениями важностей факторов по фолдам. Функция forward_selection запускает прямой последовательный отбор факторов, начиная с самого значимого и добавляя после обучения следующий по значимости (рис. 9). Данный метод имеет критерий остановки, когда среднее значение оптимизационной метрики выше оригинальной более чем на половине фолдах. Функция backward_selection работает на том же принципе, только изначально из всего списка факторов исключается самый незначимый, и последующий за ним на следующей итерации. Таким образом два данных метода позволяют остановиться на том количестве факторов, с помощью которых метрика не будет хуже требуемой после кросс‑валидационного обучения.

Рисунок 9. Результаты Forward Selection анализа

Отличие deep_backward_selection от backward_selection метода в том, что у первого нет критерия остановки. Таким образом этот метод является жадным и будет перебирать каждый из факторов, пока не исключит все те, при которых метрика ухудшалась, т. е. если посмотреть на график forward selection (рис. 9), то deep_backward_selection при заданном пороге сглаживания исключит пиковые факторы, к примеру, SibSp или Embarked, тем самым сгладив функцию возрастания / убывания метрики.

Результирующей таблицей является обучение соло модели на каждом из получившихся списков факторов и применение модели на тестовом отложенном множестве, для выбора наилучшего результата с помощью функции report (рис. 10). По результатам таблицы, целесообразно выбрать список факторов, который получился после deep_backward_selection, так как среднее значение метрики на валидации и значение на отложенном множестве являются наивысшими.

Рисунок 10. Итоговая таблица метрик

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

Итоги

Сегодня мы обсудили один из важнейших этапов моделирования: отбор факторов для модели.

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

Больше примеров работы с библиотекой autobinary можно найти здесь.

Над библиотекой работали: