Привет! Меня зовут Дмитрий Тимохин, и я являюсь одним из разработчиков библиотеки Autobinary. Ранее, вместе с коллегами из команды «Модели управления Жизненным Циклом Клиента», мы рассказывали вам о кросс‑валидации в autobinary. Сейчас я остановлюсь на том, как можно извлекать только информативные факторы, используя популярные методы отбора совместно с кросс‑валидацией.
P. S. Features в разных статьях могут называться немного по‑разному: факторы, фичи, признаки.
Отбор факторов
С появлением новых источников данных, генерацией и накоплением факторов, каждый разработчик сталкивается с такой проблемой как отбор более значимых факторов, сокращением признакового пространства при улучшении или сохранении значения метрики и стабильности алгоритма.
Существует множество методов отбора факторов, начиная от однофакторного анализа, заканчивая глубоким перебором каждого из факторов в разрезе всех используемых в модели. Каждый из таких методов требует определенного количества единиц мощности, а также свои предпосылки к их использованию. Рассмотрим методы, используемые в нашей библиотеке Autobinary и их применение на всем известной задаче предсказания вероятности выживания при крушении титаника.
Однофакторный и многофакторный анализ, первичный отбор факторов
Перед обработкой факторов и разделением генеральной совокупности данных на обучающее, тестовое и валидационное множества, мы обрабатываем ошибки в факторах и проверяем их на количество пропусков. Таким образом для проверки факторов на пропуски, применяется класс NansAnalysis (рис. 1), в который подаем генеральную совокупность данных. Данный класс включает в себя две функции to_types и fit. В первую передается список количественных переменных для обработки бесконечных значений и приведением к типу float, во второй обозначается порог доли пропусков, при котором факторы будут исключены из дальнейшего анализа.
После обработки факторов на ошибки, проверки на пропуски и разделением генеральной совокупности данных на обучающее, тестовое и валидационное множества, начинается первичный отбор факторов на обучающем множестве. Класс необходимый для его проведения является PrimarySelection (рис. 2), на вход которого подаются обучающее множество, пайплайн предобработки факторов, о котором было рассказано в предыдущей части статьи об Autobinary, списки с названиями количественных и категориальных переменных, название столбца с целевой переменной, тип модели, а также тип решаемой задачи.
Данный класс позволяет применить следующие методы:
1. Корреляционный анализ — corr_analysis (рис. 3). На вход функции передается метод расчета корреляции «spearman» / «pearson» — стоит понимать распределения факторов, для использования того или иного метода, threshold — пород при котором факторы являются коррелирующими и флаг исключения факторов. Во время расчета корреляции, также происходит расчет метрики по каждому фактору его разделяющей способности относительно целевой переменной, флаг drop_with_most_correlation говорит о том, что при значении True исключаются те факторы, которые чаще всего коррелировали с остальными, при значении False исключаются факторы имеющие худшую разделяющую и объясняющую способности, т. е. если признак коррелирует еще с n‑количеством признаков, но является более значимым по метрике gini / r2, из анализа будут исключатся его пары с наименьшим значением по метрике.
2. Анализ значимости факторов относительно глубины алгоритма — depth_analysis (рис. 4). На вход функции подаются список признаков, которые будут рассмотрены и максимальное значение глубины, до которого будет обучаться алгоритм. Таким образом получаются значимости факторов на глубине 1, 2, 3… n, значимости факторов усредняются и исключаются те, значение которых в среднем было равно 0. Также на каждой из глубин проставляется ранг фактора, значение значимости которого было больше 0, и после всего обучения рассчитывается средний ранг фактора относительно всех глубин алгоритма.
3. Анализ перемешивания факторов после применения обученного алгоритма — permutation_analysis (рис. 5–7). На вход функции передается список факторов, которые будут рассмотрены, стратегия разделения обучающего множества для обучения и проверки факторов при перемешивании, количество перемешиваний, библиотека Permutation Importance (sklearn / eli5 / kib), количество ядер, метрика для проверки и направленность метрики. На момент инициализации класса PrimarySelection создается признак из случайно сгенерированных чисел размерности равным размеру обучающего множества (random_feature). Данный признак необходим для отбора факторов в методе Permutation Importance. Как этот метод работает? Все довольно просто, на списке факторов, полученных с предыдущих этапов, происходит обучение алгоритма и запоминается значение метрики на оригинальном пространстве признаков. Далее алгоритм применяется на множестве, в котором каждый фактор перемешивается случайным образом отдельно от остальных и происходит сравнение значения метрики на полученном множестве относительно оригинального. Если метрики сильно ухудшается — фактор является значимым, если почти не меняется или меняется в лучшую сторону — то стоит исключить данный фактор из анализа. Пороговым значением отбора здесь и является значение метрики при перемешивании случайно сгенерированного фактора, т. е. если при перемешивании случайного признака метрика ухудшилась сильнее, чем при рассматриваемом признаке — то данный признак приравнивается к шумному. Средний список факторов формируется функцией select_features в классе PrimarySelection.
Класс PrimarySelection используется перед основным блоком обучения алгоритма, так как позволяет сократить признаковое пространство в несколько раз, тем самым сокращая потребляемые мощности при кросс‑валидационным обучением и подборе гиперпараметров. По опыту применения в практике, с помощью PrimarySelection удается сократить длинный список факторов до среднего с ~2500 до ~500, имеющих влияние выше случайного шума.
Все отобрали, куда дальше?
После первичного отбора факторов и получения их среднего списка, мы проводим кросс‑валидационное обучение, поиск оптимального количества итераций с контролем переобучения на отложенных фолдах, о котором рассказывается в первой части статьи об Autobinary. Но даже после получения оптимального набора гиперпараметров, метрик обучения, удовлетворяющих как разработчика, так и бизнес заказчика, всегда встает вопрос, а можно ли еще улучшить метрику, добиться еще более стабильного алгоритма отобрав факторы более детально, тем самым сократив мощности на внедрение и применение модели?
От такого вопроса зависит будем ли мы проводить глубокий отбор факторов для финализации модели или нет. Если в нашу модель все еще попадает большое количество факторов, то мы всегда хотим проверить можно ли сформировать из них короткий список, не теряя в качестве и стабильности алгоритма. На помощь нам приходит класс AutoSelection (рис. 8), на вход которому подаются пайплайн предобработки факторов, списки названия количественных и категориальных переменных, параметры обучения на кросс‑валидации, модель, обучающее признаковое пространство и целевая переменная, оптимизационная метрика и тип алгоритма обучения.
Данный класс содержит в себе несколько методов отбора при контроле качества обучения, а именно:
Forward selection;
Backward selection;
Deep backward selection.
Перед перебором факторов, класс AutoSelection повторяет кросс‑валидационное обучение, наследуя класс AutoTrees, запоминает среднее значение метрики и список со средними значениями важностей факторов по фолдам. Функция forward_selection запускает прямой последовательный отбор факторов, начиная с самого значимого и добавляя после обучения следующий по значимости (рис. 9). Данный метод имеет критерий остановки, когда среднее значение оптимизационной метрики выше оригинальной более чем на половине фолдах. Функция backward_selection работает на том же принципе, только изначально из всего списка факторов исключается самый незначимый, и последующий за ним на следующей итерации. Таким образом два данных метода позволяют остановиться на том количестве факторов, с помощью которых метрика не будет хуже требуемой после кросс‑валидационного обучения.
Отличие deep_backward_selection от backward_selection метода в том, что у первого нет критерия остановки. Таким образом этот метод является жадным и будет перебирать каждый из факторов, пока не исключит все те, при которых метрика ухудшалась, т. е. если посмотреть на график forward selection (рис. 9), то deep_backward_selection при заданном пороге сглаживания исключит пиковые факторы, к примеру, SibSp или Embarked, тем самым сгладив функцию возрастания / убывания метрики.
Результирующей таблицей является обучение соло модели на каждом из получившихся списков факторов и применение модели на тестовом отложенном множестве, для выбора наилучшего результата с помощью функции report (рис. 10). По результатам таблицы, целесообразно выбрать список факторов, который получился после deep_backward_selection, так как среднее значение метрики на валидации и значение на отложенном множестве являются наивысшими.
Таким образом, после проведения всех методов отбора, можно сделать вывод, что не всегда большое количество сгенерированных и собранных факторов улучшает качество и стабильность алгоритма. Хотим напомнить, что модели внедряются и переобучаются через определенное время, поэтому обучить алгоритм на нестабильном факторе может стоить больших рисков, теряя ежедневно деньги для бизнеса.
Итоги
Сегодня мы обсудили один из важнейших этапов моделирования: отбор факторов для модели.
В следующей части мы расскажем о следующих этапах: подбор параметров модели и интерпретация факторов.
Больше примеров работы с библиотекой autobinary можно найти здесь.
Над библиотекой работали:
Василий Сизов — https://github.com/Vasily‑Sizov
Дмитрий Тимохин — https://github.com/dmitrytimokhin
Павел Зеленский — https://github.com/vselenskiy777
Руслан Попов — https://github.com/RuslanPopov98