Aspiring Data Science
373 subscribers
425 photos
11 videos
10 files
1.87K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#ml #featureselection #featureengineering #mrmr #sulov

Наткнулся на новую библиотечку по созданию и отбору признаков. Гордятся реализацией MRMR (Minimum Redundancy Maximum Relevance) и SULOV (Searching for Uncorrelated List of Variables).

https://github.com/AutoViML/featurewiz
❤‍🔥1👍1
#ml #featureselection #mrmr #uber

Оказывается, сотрудники Uber уже проводили сравнение методов FS на синтетике (70 фичей, смешно) и 3 реальных датасетах (upsell/crosssell, ~ тысяча фичей) в парадигме mRMR. Работа мне не понравилась:
1) хотелось бы видеть сравнение с другими парадигмами FS
2) что за странный выбор моделей? самой сильной из выбранных был случайный лес. в 2019м бустинги уже были.
3) не было HPT
4) не было ES
5) для синтетики не показали, угадал ли блок FS истинные предикторы
6) непонятно, как обработали категорийку

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

Но скажу из своего опыта: когда фичей десятки тысяч, и одна из них чуть ли не прямо определяет таргет, + есть изрядно избыточных, сдыхают даже бустинги (а именно, катбуст) - показывают слабую зависимость, хотя по идее должны 100% выучить связь.
#featureselection #selectfrommodel #rfe #rfecv #diogenes

Ч. 1

Как работают embedded, filters и wrappers подходы к отбору признаков, что лучше использовать в бою, и почему sklearn-овская реализация RFECV недостаточно хороша?

embedded (встроенные) делают отбор признаков частью процесса обучения модели (к примеру, используя специализированные функции потерь). К примеру, L-1 регуляризация в Lasso и ElasticNet регресиях способна занулять коэффициент при факторах и тем самым полностью исключать их из работы.
плюсы: удобство, не надо создавать отдельный FS компонент, органичная интеграция в основной алгоритм. минусы: мало моделей с поддержкой embedded.

wrappers (обёртки) для оценки подмножеств факторов применяет отдельную предсказательную модель и внешний критерий. Критерием могут быть как непосредственно ML метрики(обычно на отложенной выборке), так и относительные важности признаков.
плюсы: позволяет оценивать большие подмножества/группы факторов; универсальность, работает со всеми базовыми моделями. минусы: большое время работы, пропорциональное количеству факторов.

filters (фильтры) вместо дорогой в обучении предсказательной модели используют более простую вычислительно оценку наличия связи между фактором (или небольшой группой факторов) и таргетом. Это может быть коэффициент линейной корреляция или взаимной информации. Фильтры могут быть простейшие, независимые по 1 переменной, или более сложные, по нескольким и даже с учётом внутренней избыточности (см #MRMR). Иногда рассматривается просто информационное содержание (энтропия) фактора, без связи с таргетом.
плюсы: быстрый; универсальный. минусы: проблемы с одновременным учётом больше 2-3 факторов.

Для полноты картины, есть ещё полный перебор подмножеств признаков, но в современных реалиях это скорее академическое упражнение, разве что у Вас в какой-то специфической задаче датасет и правда содержит не больше 5-6 факторов.

На текущий момент, по моему скромному опыту, для задач с большим (сотни,тысячи, ++) кол-вом признаков предпочтительным решением кажутся обёрточные (wrappers) методы с привлечением информации о важности признаков. Последняя зачастую довольно точна и полезна, может учитывать нелинейности и внутренние связи (особенно в современных бустингах), и позволяет заменить крайне дорогостоящий полный перебор/дообучение простым ранжированием важностей.

Давайте рассмотрим (в порядке роста изощрённости) обёрточные алгоритмы FS, использующий важности признаков.

SelectFromModel(estimator,n_features_to_select) обучает модель лишь 1 раз, и за один шаг сразу отбрасывает все низкорейтинговые признаки, чтобы оставить только нужное пользователю число фичей.

RFE(estimator,n_features_to_select) (Recursive Feature Elimination) можно рассматривать как улучшение SelectFromModel: RFE сделает то же самое, но не за 1 ход, а постепенно, итеративно отбрасывая по N самых слабых признаков и переобучая модель, чтобы использовать дальше уже новые важности признаков. Идея в том, что удаление признаков может вести к тому, что относительные важности оставшихся достаточно сильно изменятся, и RFE как раз сможет эти перетасовки учесть.

У обоих алгоритмов есть недостаток: пользователю нужно знать заранее, какое число признаков оставить, а ему это знать обычно неоткуда.

RFECV (RFE with Cross-Validation) решает эту проблему: вместо строгого n_features_to_select, у него есть параметр min_features_to_select. Входные данные RFECV разбивает на несколько train/test фолдов, и для каждого train фолда в отдельности просто запускает старого добого RFE(n_features_to_select=min_features_to_select). RFE всё так же проходится по числу оставленных признаков сверху вниз, но теперь дополнительно каждый набор признаков скорится на тестовом фолде.
По итогу, best_n_features с лучшим средним скором по всем тестовым фолдам и возвращается как ответ, а конкретные признаки выбираются финальным запуском RFE(n_features_to_select=best_n_features) уже на полном входном датасете.
#diogenes #featureselection #rfecv #mrmr

Ну и немного новостей по проекту Диоген. Собрал и потестировал на синтетике 2 полноценных отборщика признаков, filter & wrapper. мой улучшенный RFECV отлично отработал на датасете с 250+ факторами, 11k записями: из 11 значимых факторов нашёл 9, причём и нелинейные, и 2-way XOR, и 3-way XOR. Не смог найти 2 фактора с частичной зависимостью (на 10% и 30% области определения). Ну я не сильно расстроился, найди он и это на 11k записей, это было бы чудом. При росте числа записей находит и их. Что выяснилось: промежуточные модельки надо фиттить прям до упора (насколько ES позволяет).

И, кажется, оправдалась моя идея, что важности признаков надо складировать со всех запусков, а не только с самого первого. Оптимизатор мой MBHO отлично отработал - сократил время поиска вдвое. В общем, не зря пилил этот проект полгода.

В то же время, MRMR находит только 6 важных признаков из 11. Но время работы, Карл! 2 часа RFECV против 2 минут MRMR.

Мне уже стало казаться, что в бою на больших данных RFECV ну просто будет неприменим по времени. Начал тестировать на реальном датасете с 500+ столбцов общим размером 50Гб. Подождал часов 6 на сервере с 16 ядрами, за это время не обучилась полностью даже 1я FS моделька, махнул рукой. Придётся переносить тесты RFECV на GPU сервер с приличным объёмом VRAM.

Перешёл к тестированию MRMR. Тут тоже в реальности не всё гладко оказалось, биннинг датасета, который на небольшой синтетике шёл 2 секунды на 1 ядре, в реальном проекте растянулся на полчаса. Пришлось переписывать под многопоток, заодно улучшил работу с пропусками и отловил пару багов. Биннинг стал отрабатывать за 2 минуты. И снова сюрприз, который отнял полдня. Оказалось, что np.random.shuffle в многопотоке ужасно тормозит, пришлось оборачивать его в njit.

В итоге тестирую MRMR с полной загрузкой CPU на финансовом проекте, очень интересно смотреть в реальном времени, что он находит.
🔥3