Привет! Меня зовут Дмитрий Тимохин, и я являюсь одним из разработчиков библиотеки Autobinary. Ранее, вместе с коллегами из команды «Модели управления Жизненным Циклом Клиента», мы рассказывали вам о кросс‑валидации в autobinary. Сейчас я остановлюсь на том, как можно извлекать только информативные факторы, используя популярные методы отбора совместно с кросс‑валидацией.
P. S. Features в разных статьях могут называться немного по‑разному: факторы, фичи, признаки.
Отбор факторов
С появлением новых источников данных, генерацией и накоплением факторов, каждый разработчик сталкивается с такой проблемой как отбор более значимых факторов, сокращением признакового пространства при улучшении или сохранении значения метрики и стабильности алгоритма.
Существует множество методов отбора факторов, начиная от однофакторного анализа, заканчивая глубоким перебором каждого из факторов в разрезе всех используемых в модели. Каждый из таких методов требует определенного количества единиц мощности, а также свои предпосылки к их использованию. Рассмотрим методы, используемые в нашей библиотеке Autobinary и их применение на всем известной задаче предсказания вероятности выживания при крушении титаника.
Однофакторный и многофакторный анализ, первичный отбор факторов
Перед обработкой факторов и разделением генеральной совокупности данных на обучающее, тестовое и валидационное множества, мы обрабатываем ошибки в факторах и проверяем их на количество пропусков. Таким образом для проверки факторов на пропуски, применяется класс NansAnalysis (рис. 1), в который подаем генеральную совокупность данных. Данный класс включает в себя две функции to_types и fit. В первую передается список количественных переменных для обработки бесконечных значений и приведением к типу float, во второй обозначается порог доли пропусков, при котором факторы будут исключены из дальнейшего анализа.
![Рисунок 1. Анализ пропусков Рисунок 1. Анализ пропусков](https://habrastorage.org/getpro/habr/upload_files/b28/89c/b41/b2889cb4190b2168db3d747ec1cea5a6.png)
После обработки факторов на ошибки, проверки на пропуски и разделением генеральной совокупности данных на обучающее, тестовое и валидационное множества, начинается первичный отбор факторов на обучающем множестве. Класс необходимый для его проведения является PrimarySelection (рис. 2), на вход которого подаются обучающее множество, пайплайн предобработки факторов, о котором было рассказано в предыдущей части статьи об Autobinary, списки с названиями количественных и категориальных переменных, название столбца с целевой переменной, тип модели, а также тип решаемой задачи.
![Рисунок 2. Инициализация класса первичного отбора факторов Рисунок 2. Инициализация класса первичного отбора факторов](https://habrastorage.org/getpro/habr/upload_files/e19/27e/7a5/e1927e7a5248428a1bab93716d02c502.png)
Данный класс позволяет применить следующие методы:
1. Корреляционный анализ — corr_analysis (рис. 3). На вход функции передается метод расчета корреляции «spearman» / «pearson» — стоит понимать распределения факторов, для использования того или иного метода, threshold — пород при котором факторы являются коррелирующими и флаг исключения факторов. Во время расчета корреляции, также происходит расчет метрики по каждому фактору его разделяющей способности относительно целевой переменной, флаг drop_with_most_correlation говорит о том, что при значении True исключаются те факторы, которые чаще всего коррелировали с остальными, при значении False исключаются факторы имеющие худшую разделяющую и объясняющую способности, т. е. если признак коррелирует еще с n‑количеством признаков, но является более значимым по метрике gini / r2, из анализа будут исключатся его пары с наименьшим значением по метрике.
![Рисунок 3. Корреляционный анализ факторов Рисунок 3. Корреляционный анализ факторов](https://habrastorage.org/getpro/habr/upload_files/874/2c1/f84/8742c1f84fdfcf08d53c2bf7358f8e17.png)
2. Анализ значимости факторов относительно глубины алгоритма — depth_analysis (рис. 4). На вход функции подаются список признаков, которые будут рассмотрены и максимальное значение глубины, до которого будет обучаться алгоритм. Таким образом получаются значимости факторов на глубине 1, 2, 3… n, значимости факторов усредняются и исключаются те, значение которых в среднем было равно 0. Также на каждой из глубин проставляется ранг фактора, значение значимости которого было больше 0, и после всего обучения рассчитывается средний ранг фактора относительно всех глубин алгоритма.
![Рисунок 4. Анализ значимости факторов относительно глубины алгоритма Рисунок 4. Анализ значимости факторов относительно глубины алгоритма](https://habrastorage.org/getpro/habr/upload_files/efa/52d/63f/efa52d63f1a003e05856d87e3c54d68f.png)
3. Анализ перемешивания факторов после применения обученного алгоритма — permutation_analysis (рис. 5–7). На вход функции передается список факторов, которые будут рассмотрены, стратегия разделения обучающего множества для обучения и проверки факторов при перемешивании, количество перемешиваний, библиотека Permutation Importance (sklearn / eli5 / kib), количество ядер, метрика для проверки и направленность метрики. На момент инициализации класса PrimarySelection создается признак из случайно сгенерированных чисел размерности равным размеру обучающего множества (random_feature). Данный признак необходим для отбора факторов в методе Permutation Importance. Как этот метод работает? Все довольно просто, на списке факторов, полученных с предыдущих этапов, происходит обучение алгоритма и запоминается значение метрики на оригинальном пространстве признаков. Далее алгоритм применяется на множестве, в котором каждый фактор перемешивается случайным образом отдельно от остальных и происходит сравнение значения метрики на полученном множестве относительно оригинального. Если метрики сильно ухудшается — фактор является значимым, если почти не меняется или меняется в лучшую сторону — то стоит исключить данный фактор из анализа. Пороговым значением отбора здесь и является значение метрики при перемешивании случайно сгенерированного фактора, т. е. если при перемешивании случайного признака метрика ухудшилась сильнее, чем при рассматриваемом признаке — то данный признак приравнивается к шумному. Средний список факторов формируется функцией select_features в классе PrimarySelection.
![Рисунок 5. Permuataion Importance анализ Рисунок 5. Permuataion Importance анализ](https://habrastorage.org/getpro/habr/upload_files/7db/032/85f/7db03285ffdee837617b365269a46528.png)
![Рисунок 6. Визуализация Permutation Importance анализа Рисунок 6. Визуализация Permutation Importance анализа](https://habrastorage.org/getpro/habr/upload_files/7fd/f4a/a56/7fdf4aa5617c89f0b091a55ff21a8c63.png)
![Рисунок 7. Отбор факторов после Permutation Importance Рисунок 7. Отбор факторов после Permutation Importance](https://habrastorage.org/getpro/habr/upload_files/acf/556/211/acf55621109d705c32cdd869f8d49f79.png)
Класс PrimarySelection используется перед основным блоком обучения алгоритма, так как позволяет сократить признаковое пространство в несколько раз, тем самым сокращая потребляемые мощности при кросс‑валидационным обучением и подборе гиперпараметров. По опыту применения в практике, с помощью PrimarySelection удается сократить длинный список факторов до среднего с ~2500 до ~500, имеющих влияние выше случайного шума.
Все отобрали, куда дальше?
После первичного отбора факторов и получения их среднего списка, мы проводим кросс‑валидационное обучение, поиск оптимального количества итераций с контролем переобучения на отложенных фолдах, о котором рассказывается в первой части статьи об Autobinary. Но даже после получения оптимального набора гиперпараметров, метрик обучения, удовлетворяющих как разработчика, так и бизнес заказчика, всегда встает вопрос, а можно ли еще улучшить метрику, добиться еще более стабильного алгоритма отобрав факторы более детально, тем самым сократив мощности на внедрение и применение модели?
От такого вопроса зависит будем ли мы проводить глубокий отбор факторов для финализации модели или нет. Если в нашу модель все еще попадает большое количество факторов, то мы всегда хотим проверить можно ли сформировать из них короткий список, не теряя в качестве и стабильности алгоритма. На помощь нам приходит класс AutoSelection (рис. 8), на вход которому подаются пайплайн предобработки факторов, списки названия количественных и категориальных переменных, параметры обучения на кросс‑валидации, модель, обучающее признаковое пространство и целевая переменная, оптимизационная метрика и тип алгоритма обучения.
![Рисунок 8. Инициализация класса AutoSelection Рисунок 8. Инициализация класса AutoSelection](https://habrastorage.org/getpro/habr/upload_files/6e4/91c/a11/6e491ca118af8d824c5a21856b04c3a5.png)
Данный класс содержит в себе несколько методов отбора при контроле качества обучения, а именно:
-
Forward selection;
-
Backward selection;
-
Deep backward selection.
Перед перебором факторов, класс AutoSelection повторяет кросс‑валидационное обучение, наследуя класс AutoTrees, запоминает среднее значение метрики и список со средними значениями важностей факторов по фолдам. Функция forward_selection запускает прямой последовательный отбор факторов, начиная с самого значимого и добавляя после обучения следующий по значимости (рис. 9). Данный метод имеет критерий остановки, когда среднее значение оптимизационной метрики выше оригинальной более чем на половине фолдах. Функция backward_selection работает на том же принципе, только изначально из всего списка факторов исключается самый незначимый, и последующий за ним на следующей итерации. Таким образом два данных метода позволяют остановиться на том количестве факторов, с помощью которых метрика не будет хуже требуемой после кросс‑валидационного обучения.
![Рисунок 9. Результаты Forward Selection анализа Рисунок 9. Результаты Forward Selection анализа](https://habrastorage.org/getpro/habr/upload_files/8e7/c10/07c/8e7c1007c2db1410e9ebf9c00d8bbd11.png)
Отличие deep_backward_selection от backward_selection метода в том, что у первого нет критерия остановки. Таким образом этот метод является жадным и будет перебирать каждый из факторов, пока не исключит все те, при которых метрика ухудшалась, т. е. если посмотреть на график forward selection (рис. 9), то deep_backward_selection при заданном пороге сглаживания исключит пиковые факторы, к примеру, SibSp или Embarked, тем самым сгладив функцию возрастания / убывания метрики.
Результирующей таблицей является обучение соло модели на каждом из получившихся списков факторов и применение модели на тестовом отложенном множестве, для выбора наилучшего результата с помощью функции report (рис. 10). По результатам таблицы, целесообразно выбрать список факторов, который получился после deep_backward_selection, так как среднее значение метрики на валидации и значение на отложенном множестве являются наивысшими.
![Рисунок 10. Итоговая таблица метрик Рисунок 10. Итоговая таблица метрик](https://habrastorage.org/getpro/habr/upload_files/3a4/e2d/77e/3a4e2d77e9e3d8088a3ec0ac3a747d4a.png)
Таким образом, после проведения всех методов отбора, можно сделать вывод, что не всегда большое количество сгенерированных и собранных факторов улучшает качество и стабильность алгоритма. Хотим напомнить, что модели внедряются и переобучаются через определенное время, поэтому обучить алгоритм на нестабильном факторе может стоить больших рисков, теряя ежедневно деньги для бизнеса.
Итоги
Сегодня мы обсудили один из важнейших этапов моделирования: отбор факторов для модели.
В следующей части мы расскажем о следующих этапах: подбор параметров модели и интерпретация факторов.
Больше примеров работы с библиотекой autobinary можно найти здесь.
Над библиотекой работали:
-
Василий Сизов — https://github.com/Vasily‑Sizov
-
Дмитрий Тимохин — https://github.com/dmitrytimokhin
-
Павел Зеленский — https://github.com/vselenskiy777
-
Руслан Попов — https://github.com/RuslanPopov98
ссылка на оригинал статьи https://habr.com/ru/articles/730028/
Добавить комментарий