#featureselection #selectfrommodel #rfe #rfecv #diogenes
Ч. 2
RFECV кажется самым продвинутым и эффективным алгоритмом отбора признаков в sklearn, что же мне в нём могло не понравиться?
1) итоговые best_n_features выбираются по всем данным и по итогам только 1 обучения модели (а именно, предыдущего с best_n_features+1 фичами).
а если я обучу модель ещё раз, точно будут отобраны те же фичи, или нет? подозреваю, что этот способ неустойчив.
2) информация о важности признаков от обученных моделек с уровней от best_n_features+1 может использоваться только косвенно, а с уровней ниже best_n_features-1 вообще никак.
А что, если бы мы могли все эти важности как-то комбинировать, ну хотя бы голосованием? (привет #votenrank)
3) все обучения моделей внутри RFE/RFECV не поддерживают раннюю остановку. все решения вы будете принимать по оверфитнутым моделям.
4) для задачи с 10_000 фичами всё ещё надо обучить 10_000 моделек. Допустим, у нас терабайтный датасет, и даже на мощном сервере обучение идёт несколько часов. Да, можно задать шаг в 200, и обучить 50 моделек за пару суток, но и придётся пожертвовать точностью в +- 200 полезных признаков. Как там говорит Хеттингер, THERE MUST BE A BETTER WAY! А нельзя ли, попробовав несколько вариантов n_features и глядя на получающийся график скоров, определять следующих кандидатов для проверки более интеллектуально? Это же задача одномерной глобальной оптимизации! см #MBHO
5) даже в случае допустимости по ресурсам шага=1 и полного перебора, признаки имеют свою стоимость: приобретения, создания, хранения в featurestore. + из-за случайностей в разбиении конкретных данных Вы на протяжении десятков и сотен избыточных (и даже совершенно нерелевантных) признаков будете видеть на графике неубывающую полезность, из которой RFECV возьмёт абсолютный максимум, тем самым завысив реально полезное число признаков. Хотелось бы ввести понятие средней стоимости 1 признака, и от непосредственного ML функционала отнимать (шкалированную) стоимость получившегося набора данных. Это создаст адекватный и чёткий глобальный экстремум полезности.
6) некоторые признаки реально могут быть крайне дорогими сами по себе, если их приходится приобретать. в этом случае нужно пытаться их заменить на более дешёвые, и сравнивать каждый раз выгоду от увеличения точности модели с затратами на приобретение признаков.
7) по ходу отбора признаков обучается много моделей, по идее, это даёт вал ценной информации, значительная часть которой (по старой традиции кудесников дата сайенс из sklearn) потом просто выбрасывается, несмотря на потраченные часы вычислений. Давайте не забывать, после FS мы наверняка захотим ещё затюнить гиперпараметры нашей основной модельки, и будем перебирать/переобучать ещё сотни комбинаций (причём на тех же данных, что были использованы для FS), что будет стоить нам дополнительных часов. Так а кто нам мешает задавать моделькам с шага FS разные значения гиперпараметров и тем самым выучить оптимальные ещё до этапа HPO/HPT?!
8) глупое техническое ограничение. sklearn вам не позволит использовать датасет с категориальными признаками (даже если модель их поддерживает).
Решение этих проблем и является моей мотивацией при создании модуля wrappers библиотеки отбора признаков Diogenes.
Есть у меня подозрение, что самым эффективным в итоге окажется гибрид MRMR и RFECV (+возможно, Branch & Bound), но это уже тема другого разговора.
Ч. 2
RFECV кажется самым продвинутым и эффективным алгоритмом отбора признаков в sklearn, что же мне в нём могло не понравиться?
1) итоговые best_n_features выбираются по всем данным и по итогам только 1 обучения модели (а именно, предыдущего с best_n_features+1 фичами).
а если я обучу модель ещё раз, точно будут отобраны те же фичи, или нет? подозреваю, что этот способ неустойчив.
2) информация о важности признаков от обученных моделек с уровней от best_n_features+1 может использоваться только косвенно, а с уровней ниже best_n_features-1 вообще никак.
А что, если бы мы могли все эти важности как-то комбинировать, ну хотя бы голосованием? (привет #votenrank)
3) все обучения моделей внутри RFE/RFECV не поддерживают раннюю остановку. все решения вы будете принимать по оверфитнутым моделям.
4) для задачи с 10_000 фичами всё ещё надо обучить 10_000 моделек. Допустим, у нас терабайтный датасет, и даже на мощном сервере обучение идёт несколько часов. Да, можно задать шаг в 200, и обучить 50 моделек за пару суток, но и придётся пожертвовать точностью в +- 200 полезных признаков. Как там говорит Хеттингер, THERE MUST BE A BETTER WAY! А нельзя ли, попробовав несколько вариантов n_features и глядя на получающийся график скоров, определять следующих кандидатов для проверки более интеллектуально? Это же задача одномерной глобальной оптимизации! см #MBHO
5) даже в случае допустимости по ресурсам шага=1 и полного перебора, признаки имеют свою стоимость: приобретения, создания, хранения в featurestore. + из-за случайностей в разбиении конкретных данных Вы на протяжении десятков и сотен избыточных (и даже совершенно нерелевантных) признаков будете видеть на графике неубывающую полезность, из которой RFECV возьмёт абсолютный максимум, тем самым завысив реально полезное число признаков. Хотелось бы ввести понятие средней стоимости 1 признака, и от непосредственного ML функционала отнимать (шкалированную) стоимость получившегося набора данных. Это создаст адекватный и чёткий глобальный экстремум полезности.
6) некоторые признаки реально могут быть крайне дорогими сами по себе, если их приходится приобретать. в этом случае нужно пытаться их заменить на более дешёвые, и сравнивать каждый раз выгоду от увеличения точности модели с затратами на приобретение признаков.
7) по ходу отбора признаков обучается много моделей, по идее, это даёт вал ценной информации, значительная часть которой (по старой традиции кудесников дата сайенс из sklearn) потом просто выбрасывается, несмотря на потраченные часы вычислений. Давайте не забывать, после FS мы наверняка захотим ещё затюнить гиперпараметры нашей основной модельки, и будем перебирать/переобучать ещё сотни комбинаций (причём на тех же данных, что были использованы для FS), что будет стоить нам дополнительных часов. Так а кто нам мешает задавать моделькам с шага FS разные значения гиперпараметров и тем самым выучить оптимальные ещё до этапа HPO/HPT?!
8) глупое техническое ограничение. sklearn вам не позволит использовать датасет с категориальными признаками (даже если модель их поддерживает).
Решение этих проблем и является моей мотивацией при создании модуля wrappers библиотеки отбора признаков Diogenes.
Есть у меня подозрение, что самым эффективным в итоге окажется гибрид MRMR и RFECV (+возможно, Branch & Bound), но это уже тема другого разговора.