Всесторонний обзор литературы и код по методам на основе фильтров для выбора функций.

Если вы специалист по данным и вас поразило проклятие размерности, этот пост для вас. Вот всесторонний обзор (с примерами) алгоритмов выбора признаков. Мы заканчиваем обсуждение, интегрируя и оценивая ансамбль различных селекторов функций для округленного вывода.

Во-первых, давайте начнем с определения того, чем не является выбор признаков. Если вы столкнулись с проблемой высокой размерности, вы, вероятно, слышали термины «уменьшение размерности (или PCA/Auto Encoders)» и «выбор признаков». Прежде чем мы углубимся в выбор функций, вот краткое описание уменьшения размерности, которое поможет вам решить, следует ли вам использовать этот подход.

Уменьшение размера

Уменьшение размерности помогает нам уменьшить количество функций путем преобразования данных из пространства функций в скрытое пространство. Предполагается, что это меньшее пространство должно представлять изученные функции в более сжатой форме. Если мы правильно выберем размер скрытого пространства, то сможем даже уменьшить шум и удалить ненужную информацию. Большим недостатком этого подхода является его объяснимость. Переходя из пространства признаков в скрытое пространство, мы больше не смотрим непосредственно на признаки, а только на их представления, которые, как правило, не имеют интуитивного объяснения или логики, как у признаков. Этот подход становится удобным при работе с неструктурированными данными, такими как изображения или сигналы. См. здесь и здесь для дальнейшего обсуждения смысла скрытого пространства.

В заключение, если объяснимость важна для вашего проекта или по какой-то причине вы хотите сохранить исходное представление, уменьшение размерности не для вас, и вы находитесь в правильном месте.

Выбор функции

Методы выбора объектов позволяют вам выбрать лучшие объекты в вашем наборе данных с учетом (относительно) некоторых критериев. Звучит очевидно, верно? Тем не менее, существует МНОГО различных методов, каждый из которых определяет качество функции немного по-разному, и для правильного выбора лучшей функции вам, вероятно, понадобится более одного метода.

Во-первых, немного терминологии: методы выбора признаков можно разделить на три семейства:

(1) Методы фильтрации. Выбор функций осуществляется в рамках предварительной обработки, то есть перед обучением модели. Мы отфильтровываем функции, которые плохо работают по некоторым критериям. Наивным критерием была бы простая корреляция. Этот подход сияет, когда у нас есть массивные наборы данных, особенно когда у нас много функций. Хоф и Райфенрат (2021) обнаружили в своей работе (которая подробно рассматривается в следующем разделе), что

..три свойства делают методы [filter] особенно подходящими для определенных сценариев наборов данных. Это устойчивость к шуму, чувствительность к затратам для противодействия дисбалансу классов и рассмотрение комбинаций признаков (многомерные методы) для обнаружения избыточных признаков.

(2) Методы-оболочки. Итеративно выберите подмножество функций, обучите свою модель и выберите наилучшую комбинацию. Как вы уже можете предположить, такой подход очень дорог и практически непрактичен.

(3) Встроенные методы: не путать с вложениями, векторными представлениями слов. Встроенные методы используют оценки важности признаков, которые встроены в алгоритм. Например, Random Forest выбирает другое подмножество функций, чтобы избежать переобучения. После того, как модель была обучена, мы можем посмотреть, сколько наших функций улучшили производительность прогнозирования. Тем не менее, как и в задачах классификации, полагаясь только на встроенные методы, мы можем в конечном итоге перенастроить выбор признаков на заданный алгоритм, ограничивая нас от использования разных алгоритмов и разных наборов данных, особенно при использовании методов с высокой дисперсией, таких как деревья решений.

Методы (2) и (3) являются более дорогостоящими. Они требуют обученной модели и неявно предполагают, что мы можем обучить ее, используя все данные, что не всегда так. На следующем графике представлены различия между различными подходами к выбору признаков.

На этом мы завершаем введение и можем заняться насущными проблемами, которые привели нас сюда сегодня.

Методы фильтрации

Методы фильтрации в основном измеряют производительность функции по определенным критериям. Некоторые функции будут сиять в одних настройках, но плохо работать в других. Таким образом, использование нескольких критериев и интегрирование показателей характеристик необходимо для получения всестороннего представления о наших данных. Я старался быть как можно более инклюзивным и собирал различные методы фильтрации из литературы ([1], [2], [3], [4]). В конце концов, я закончил эту длинную статью, и, поскольку я хотел добавить немного кода и примеров, мне пришлось отфильтровать некоторые методы фильтрации (посмотрите, что я там сделал?). Другими словами, если вы хотите получить еще более глубокое представление о различных методах, я предлагаю вам просмотреть скромный обзор литературы в этой статье.

Методы фильтрации — Методы :)

Боммерт и др. [2] разделяет селекторы объектов на основе фильтров на одномерные, многомерные, методы на основе MI и методы на основе рельефа. Я сделаю то же самое здесь.

Большинство рассмотренных методов можно использовать через FSM, который доступен на моем Github здесь.

Одномерные методы

Ранжируйте признаки отдельно по их отношениям с переменной результата, независимо от других переменных. Одномерные методы могут использовать статистические тесты, такие как ANOVA, или использовать прогностическую эффективность, такую ​​как AUC, для прогнозирования результата с использованием только одного признака за раз.

Анализ дисперсии(ANOVA). Селектор функций ANOVA использует F-статистику в качестве оценки для каждой функции. В общем, F-статистика спрашивает, насколько далеко средние значения для данной функции между различными классами нашей переменной результата. Более подробное объяснение можно найти в ответе Kasra Manshaei здесь или в этом специальном посте в блоге. Другими словами, чем лучше функция разделяет разные классы, тем больше F-оценка для этой функции.

Реализация в этом случае довольно проста с использованием sklearn.

from sklearn.feature_selection import SelectKBest, f_classif
anova_filter = SelectKBest(f_classif, k=3)

И пример с использованием FSM:

selectors = FSM.FSM(k=20, filler = -1)
selectors.anova_inference(X_,y_)
# Results
# array(['member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv',
#        'int_rate', 'annual_inc', 'dti', 'inq_last_6mths',
#        'mths_since_last_record', 'pub_rec', 'revol_util', 'out_prncp',
#        'out_prncp_inv', 'total_pymnt', 'total_pymnt_inv',
#        'total_rec_prncp', 'total_rec_late_fee', 'recoveries',
#        'collection_recovery_fee', 'last_pymnt_amnt'], dtype=object)

Крускал: применяет критерий суммы рангов Краскела-Уоллиса [5] для каждого признака, который является непараметрическим эквивалентом дисперсионного анализа (т. е. это не предполагает, что наши функции нормально распределены). Прежде чем мы сможем рассчитать статистику Крускала, мы сначала должны ранжировать наши наблюдения от наименьшего к наибольшему (независимо от их соответствующего результата). Затем мы суммируем ранги внутри каждого класса i. Тогда статистика Крускала определяется выражением

Где T — сумма рангов в классе (i), n_i — количество наблюдений, принадлежащих классу (i), а n — общее количество наблюдений.

Опять же, более высокие значения этой статистики означают, что соответствующие значения признаков различаются в разных классах. Мы можем реализовать тест Крускала Уоллиса, используя scipy.

from scipy import stats
stats.kruskal(x_j, y)

И в ФСМ:

selectors = FSM.FSM(k=20, filler = -1)
selectors.kruskal_inference(X_,y_)
# Results:
# Index(['recoveries', 'collection_recovery_fee', 'out_prncp_inv', 'out_prncp',
#        'delinq_2yrs', 'pub_rec', 'total_rec_late_fee', 'acc_now_delinq',
#        'collections_12_mths_ex_med', 'inq_last_6mths', 'policy_code',
#        'revol_bal', 'dti', 'last_pymnt_amnt', 'total_rec_int',
#        'total_rec_prncp', 'total_pymnt', 'total_pymnt_inv', 'member_id',
#        'installment'],
#       dtype='object')

Хи-квадрат: в качестве оценки используется значение статистики χ2.

from sklearn.feature_selection import SelectKBest, chi2
chi2_filter = SelectKBest(chi2, k=2)

И в ФСМ:

selectors = FSM.FSM(k=20, filler = -1)
selectors.chi2(X_,y_)
# Results:
# array(['member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv',
#        'int_rate', 'installment', 'annual_inc', 'mths_since_last_record',
#        'revol_bal', 'revol_util', 'out_prncp', 'out_prncp_inv',
#        'total_pymnt', 'total_pymnt_inv', 'total_rec_prncp',
#        'total_rec_int', 'total_rec_late_fee', 'recoveries',
#        'collection_recovery_fee', 'last_pymnt_amnt'], dtype=object)

Многовариантные методы

Максимальная релевантность и минимальная избыточность (MRMR): была введена в 2005 году и недавно обрела популярность [6]. MRMR — это жадный алгоритм, работающий итеративно. Согласно следующему правилу, каждая итерация выбирает лучшую функцию и добавляет ее к ранее выбранным функциям. Это называется Максимальная релевантность — минимальная избыточность, потому что на каждой итерации мы хотим выбрать функцию с максимальной релевантностью по отношению к целевой переменной и минимальной избыточностью по отношению к выбранным функциям на предыдущих итерациях.

Хотя существует множество способов расчета MRMR, я представляю только метод FCQ. Посетите [7] для дополнительных стратегий.

Релевантность признака f на i-ой итерации (числитель) вычисляется как F-статистика между признаком и целевой переменной. Избыточность (знаменатель) рассчитывается как среднее абсолютного значения корреляции Пирсона между признаком и всеми признаками, выбранными на предыдущих итерациях.

from mrmr import mrmr_classif
data = pd.read_csv('/Users/davidharar/Downloads/data_loan.csv')
X = data._get_numeric_data().drop(['default_ind'], axis = 1)
y = data['default_ind']
selected_features = mrmr_classif(X, y, K = 14)
# K is the size of the desired subset.
selected_features

Прогнозирование производительности

Это своего рода золотая середина между методами фильтрации и встроенными методами. При таком подходе мы итеративно запускаем модель, скажем, случайный лес, только с одной функцией за раз. Затем мы ранжируем наши функции на основе знакомых KPI, таких как AUC и точность. Обычно предпочтение отдается AUC, поскольку он более устойчив к несбалансированным наборам данных и оценивается с использованием нескольких вариантов пороговых значений. Недостатком AUC является то, что он подходит только для бинарного предсказания.

Взаимная информация

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

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

Непрерывные функции должны быть дискретизированы, прежде чем мы сможем вычислить либо взаимную информацию, либо энтропию.

Пусть X и Y — две дискретные переменные с (эмпирической) функцией массы вероятности. (Безусловная) энтропия Y определяется выражением

Условная энтропия Y при заданном X определяется выражением

Взаимная информация может быть представлена ​​следующим уравнением:

Доказательство приведенного выше уравнения можно найти здесь, что дает отличную интуицию для взаимной информации в контексте приведенного выше уравнения:

...если энтропия H(Y) рассматривается как мера неопределенности в отношении случайной величины, то H(Y|X) является мерой того, что X не говорит об Y. Это количество неопределенности, остающееся относительно Y после того, как известно X», и, таким образом, правая часть второго из этих равенств может быть прочитана как «количество неопределенности в Y минус количество неопределенности в Y, которое остается после того, как известно X».

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

Жадные методы оценки взаимной информации

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

Совместная взаимная информация. Несмотря на то, что это не жадный или итеративный метод, я добавил его здесь, поскольку время от времени в некоторых статьях используется JMI в качестве метода выбора признаков. JMI несколько наивен и напоминает использование простых корреляций для фильтрации. Мы просто вычисляем совместную взаимную информацию между целью и каждым из наших признаков, затем сохраняем k самых высоких. Реализация находится в рамках JMIM

Совместная максимизация взаимной информации (JMIM) и нормализованная совместная максимизация взаимной информации (NJMIM) [8]: Как MRMR и CMIM, эти два алгоритма выполняют жадный поиск функций, которые максимизируют взаимную информацию с целью. Основное различие между JMIM и CMIM заключается в том, что последний максимизирует количество информации, которую потенциальная функция обусловливает предварительно выбранными функциями, тогда как JMIM выбирает функцию, которая максимизирует совместную взаимную информацию новой + предварительно выбранные функции с целевой функцией. Основной вывод здесь заключается в том, что JMIM также учитывает избыточность функций, в то время как CMIM только пытается максимизировать объединяющую взаимную информацию.

Примечание о реализации: Было непросто найти подробную реализацию, но мне повезло найти эту замечательную здесь. Пакет mifs позволяет использовать JMI, JMIM и MRMR. Реализация MRMR из соответствующего подраздела оказалась быстрее в моих экспериментах, а в целом JMI быстрее, чем JMIM. И последнее, когда вы устанавливаете пакет, не забудьте изменить from sklearn.feature_selection.base import SelectorMixin на from sklearn.feature_selection._base import SelectorMixin . Кроме этого, mifs гибкий и понятный.

import mifs
# define MI_FS feature selection method
feat_selector = mifs.MutualInformationFeatureSelector(method = "JMIM", n_jobs=8)
# Few important params for MutualInformationFeatureSelector:
# 1. method, self explenatory, could be "JMI", "JMIM" and "MRMR"
# 2. n_features: desired number of features after filtering.
# 3. n_jobs: How many CPUs should run parallelly.
# 
# Important attributs:
# 1. feat_selector.get_support(): Boolean vector of length p that
#    indicates whether a feature has been selected.
# 2. feat_selector.ranking_: Vector of length p that is ordered by
#    importance, for example [52,1,53,...] indicates that feature 52 
#    was the most important one.
# Both JMI and JMIM arn't compatible with NaNs
X_filled = X.fillna(-1)
feat_selector.fit(X_filled, y)
# call transform() on X to filter it down to selected features
X_filtered = feat_selector.transform(X_filled)
X_filtered = pd.DataFrame(X_filtered, columns = X_filled.columns[feat_selector.ranking_])

Быстрый фильтр на основе корреляции (FCBF). Метод фильтрации на основе корреляции, который учитывает избыточность между функциями. Функция хороша для задачи классификации, если корреляция между функцией и целью достаточно высока, чтобы сделать ее релевантной для прогнозирования. Корреляция между ним и любыми другими релевантными функциями не достигает уровня, при котором любые другие релевантные функции могут его предсказать. Поскольку линейная корреляция имеет некоторые серьезные ограничения, корреляция FCBF основана на энтропии, в частности, на симметричной неопределенности, SU.

Алгоритм работы следующий:

  1. Соответствующие функции: сначала мы вычисляем SU для каждой из наших p функций. Мы выбираем порог SU. Пусть S будет набором функций с оценкой SU выше порогового значения. Упорядочим эти функции в порядке убывания.
  2. Избыточные признаки. Начиная с первого отсортированного признака, мы вычисляем SU(j,l) для l в S. Если SU(j,l) ≥SU(цель,j), мы удаляем l из S. Удаленные функции называются «избыточными одноранговыми узлами для функции j».
selectors = FSM.FSM(k=20, filler = -1)
selectors.fcbf(X_,y_)
# Results: (fcbf has a lower bound on SU rather than k features. The default is 0).
# selectors = FSM.FSM(k=20, filler = -1)
# selectors.fcbf(X_,y_)

Максимизация условной взаимной информации (CMIM): жадный алгоритм, который выбирает признаки на основе их совместной взаимной информации с целевой переменной. Каждая итерация выбирает функцию, которая имеет максимальную взаимную информацию с целью с учетом предварительно выбранных функций. То есть мы выбираем признак, который максимизирует взаимную информацию с той частью целевой переменной, которая еще не была описана, независимо от избыточности (то есть пренебрегая высокой корреляцией между текущим признаком и предварительно выбранными).

Примечание о реализации: scikit-feature был написан на Python 2. Автор здесь преобразовал большинство функций utils в Python 3, так что в итоге я использовал его utils вместе с несколько измененными версии оригинальных функций scikit-feature. Код и рабочий пример находятся в прилагаемой записной книжке.

Реализация с FSM:

selectors = FSM.FSM(k=20, filler = -1)
selectors.cmim(X_,y_)
# Results:
# Index(['member_id', 'funded_amnt_inv', 'installment', 'open_acc', 'revol_util',
#        'total_pymnt', 'delinq_2yrs', 'annual_inc', 'dti', 'revol_bal',
#        'total_acc', 'total_pymnt_inv', 'total_rec_prncp', 'total_rec_int',
#        'total_rec_late_fee', 'recoveries', 'inq_last_6mths',
#        'mths_since_last_record', 'collections_12_mths_ex_med',
#        'mths_since_last_major_derog'],
#       dtype='object')

Двойная симметричная релевантность ввода (DISR) [9]: DISR опирается на свойство, согласно которому комбинация переменных может возвращать больше информации о выходном классе, чем сумма информация, производимая каждой из переменных, взятых в отдельности. В DISR JMI каждой функции нормализуется в зависимости от того, насколько хорошо данная функция дополняет другие функции.

Реализация с FSM:

selectors = FSM.FSM(k=20, filler = -1)
selectors.disr(X_,y_)
# Results:
# Index(['member_id', 'dti', 'recoveries', 'collection_recovery_fee',
#        'collections_12_mths_ex_med', 'mths_since_last_major_derog',
#        'policy_code', 'annual_inc_joint', 'total_rec_late_fee',
#        'total_rec_prncp', 'dti_joint', 'acc_now_delinq', 'tot_coll_amt',
#        'tot_cur_bal', 'total_pymnt', 'total_pymnt_inv', 'revol_bal',
#        'open_acc_6m', 'open_il_6m', 'open_il_12m'],
#       dtype='object')

Отбор функций на основе взаимной информации (MIFS) [10]: использует жадный выбор наилучшей функции по сравнению с другими. I(i, target) и штраф за избыточность предварительно выбранных функций.

Другие разработки в этом семействе методов выбора признаков на основе информации включают адаптивную MIFS (AMIFS) [11], условную MIFS (CMIFS) [12] и другие методы, которые из-за нехватки места оставлены в качестве упражнения для читатель.

Реализуйте MIFS с FSM:

selectors = FSM.FSM(k=20, filler = -1)
selectors.mifs(X_,y_)
# Results:
# Index(['member_id', 'collections_12_mths_ex_med',
#        'mths_since_last_major_derog', 'policy_code', 'annual_inc_joint',
#        'dti_joint', 'acc_now_delinq', 'tot_coll_amt', 'tot_cur_bal',
#        'open_acc_6m', 'open_il_6m', 'open_il_12m', 'open_il_24m',
#        'mths_since_rcnt_il', 'total_bal_il', 'il_util', 'open_rv_12m',
#        'open_rv_24m', 'max_bal_bc', 'all_util'],
#       dtype='object')

Методы на основе рельефа

Relief [13] был представлен в 1992 году для выбора признаков для бинарных целей и приобрел популярность, поскольку ReliefF обобщает его для многоклассовых целей. RReliefF — это метод регрессии на основе рельефа [14], I-RELIEF, Tuned ReliefF, VLSReliefF, SURF и ReliefSeq. Вот отличный обзор RBM [15]. Первоначальный алгоритм выглядит следующим образом. Скажем, у нас есть p разных функций и бинарная цель. Затем мы начинаем с инициализации вектора весов w длины p всеми нулями. Затем для B раз мы

  • Нарисуйте случайный пример из наших данных, скажем, из класса 0.
  • Найдите ближайший пример с точки зрения евклидова расстояния, принадлежащий тому же классу. Мы называем этот пример «близким попаданием». Точно так же мы берем ближайшую точку, принадлежащую противоположному классу, и называем ее «близкой к промаху».
  • Обновить w: для m итераций и p функций мы обновляем w_j, как в следующей формуле.

Обратите внимание, что мы снижаем важность признака j (обозначаемого w_j) на (квадратное) расстояние, которое каждый пример имеет от ближайшего примера того же класса. То есть Relief предпочитает менее разреженные функции, и функции, в которых примеры одного и того же класса находятся ближе друг к другу, будут меньше штрафоваться. Напротив, Relief придает большее значение функциям, в которых примеры из одного класса находятся дальше от примеров, принадлежащих к другому классу.

Как и в вашей обычной оценке KNN, учет только нескольких соседей может привести к зашумленным прогнозам и переобучению. Алгоритм ReliefF, в дополнение к обобщению Relief на многоклассовые цели, также включает информацию от k соседей при оценке важности. В целом (это верно и для других RBA), чем больше соседей, тем точнее оценки в некоторой степени, но для сходимости требуется больше времени.

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

I-RELIEF предложил использовать функцию взвешивания экземпляров по всему набору совпадений и промахов, а не только по одному закрытию каждого класса. SURF использовал порог расстояния T для определения экземпляров как соседей (где T был равен среднему расстоянию между всеми парами экземпляров в данных). Однако, в отличие от Iterative Relief, SURF использует одинаковые веса экземпляров для всех экземпляров, определенных как соседи [15]. Существуют и другие варианты, такие как VLSReliefF и ReliefSeq, которые здесь не рассматриваются. Этот пост на Medium предлагает более глубокое введение в методы, основанные на рельефе [16].

Хотя это и не одно и то же, методы, основанные на рельефе, имеют сходство с лапласовскими методами выбора элементов. Метод Лапласа также предполагает, что наблюдения одного и того же класса имеют тенденцию быть ближе друг к другу. При выборе лапласовских признаков мы встраиваем данные в граф ближайшего соседа, измеряя произвольное расстояние и вычисляя матрицу весов. Затем мы вычисляем критерий Лапласа для каждого признака и получаем такое свойство, что наименьшие значения соответствуют наиболее важным измерениям. Однако на практике при выделении подмножества признаков обычно используется другой алгоритм кластеризации (метод k-средних), с помощью которого выбирается наиболее эффективная группа [источник].

Два замечания об алгоритмах Relief:

Есть несколько реализаций Relief (и его вариантов) на питоне (sklearn-relief, 16, например), но эта кажется наиболее подробной scikit-rebate.
Возможно, одной из причин популярности RBA является их гибкость. RBA совместимы с сочетанием категориальных и непрерывных функций, а также с многоклассовой классификацией и регрессией. Тем не менее, поскольку они полагаются на расстояние (и KNN), они сильно страдают от проклятия размерности. В руководстве пользователя сказано:

В очень больших функциональных пространствах пользователи могут ожидать, что основные оценки алгоритма на основе рельефа станут менее надежными при самостоятельном запуске. Это связано с тем, что по мере того, как пространство признаков становится очень большим, определение ближайших соседей становится более случайным. В результате в очень больших пространствах признаков (например, > 10 000 признаков) пользователям следует рассмотреть возможность объединения базового алгоритма на основе рельефа с итеративным подходом, таким как TuRF (реализован здесь) или VLSRelieF, или итеративным рельефом.

и

При масштабировании до задач с большими данными имейте в виду, что аспект данных, который больше всего замедляет методы ReBATE, — это количество обучающих экземпляров, поскольку алгоритмы Relief масштабируются линейно с количеством функций, но квадратично с количеством обучающих экземпляров. Это результат того, что методы на основе рельефа требуют вычисления массива расстояний (т. е. всех попарных расстояний между экземплярами в наборе обучающих данных). Если у вас есть очень большое количество доступных обучающих экземпляров, рассмотрите возможность использования сбалансированной по классам случайной выборки этого набора данных при запуске любых методов ReBATE, чтобы сэкономить память и время вычислений.

А чтобы узнать конкретную временную сложность алгоритмов на основе рельефа, посетите Таблицу 5 в [15].

Реализация с FSM:

selectors = FSM.FSM(k=20, filler = -1)
selectors.ReliefF(X_,y_)
selectors.SURF(X_,y_)
selectors.SURFstar(X_,y_)
selectors.MultiSURF(X_,y_)
# Note: X_ and y_ have N=10,000, which may lead to a long computation time. 

Другие методы

Хотя мы рассмотрели широкий список алгоритмов, мы смогли только коснуться поверхности. Мы не рассмотрели неконтролируемые алгоритмы выбора признаков [17] и [18], спектральные методы выбора признаков [19] и методы на основе графов [20], [21] и [22]. Другие методы фильтрации включают Burrata, информационный фрагмент (IF), SOA и т. д. Как говорится в заголовке, этот пост предназначен для ленивых специалистов по данным. Если вам не лень, я надеюсь, вам будет интересна библиография этой статьи.

Интеграция

Хорошо, если вы дошли до этого места, возможно, у вас есть вопрос, который вас беспокоил — вы пробовали разные методы и получили разные оценки, которые не обязательно согласуются друг с другом. Что вы должны сделать?

Согласно [23], при объединении различных методов отбора необходимо учитывать следующее:

  • какие и сколько методов использовать? Они считают, что чем больше, тем лучше.
  • Количество и размеры используемого обучающего набора — должны ли мы подмножать наши данные? Начальная загрузка? Как мы видели выше, некоторые из наших алгоритмов являются квадратичными по количеству наблюдений. В целом ответ да; мы должны выполнить повторную выборку и выбрать объекты. В конце концов, мы могли бы объединить эту информацию с приведенными ниже методами оценки.
  • Сколько функций мы хотим получить? Это число может быть определено как процент от всех функций, которые у нас есть, или может быть определено заранее.
  • Как оценить метод агрегации? Я посвящу эту часть попытке ответить на этот вопрос.

Допустим, у вас есть E разных списков выбранных функций, вы можете сделать одно или несколько из следующих действий.

  1. Объедините свои E-списки в один на основе правила выбора (примеры ниже). Затем обучите одну модель, используя комбинированный список.
  2. Используя ансамбль селекторов признаков — обучите E на разных «тонких» моделях, позже, когда поступит новый набор данных, прогноз будет сделан путем прогнозирования результата с использованием E разных моделей.
  3. Золотая середина между 1 и 2 — преобразовать списки функций E в списки комбинированных функций E’ на основе различных правил E’, а затем обучить модели E’ (‹‹E) как ансамбль.

ранжирование функций в разных списках можно выполнить с помощью

  • Min: присваивайте каждому элементу наименьший (лучший) ранг, которого он достиг.
  • Медиана: присвойте каждому элементу медианный ранг, которого он достиг.
  • Среднее арифметическое: присвойте каждому элементу среднее значение рангов, которых он достиг.
  • Среднее геометрическое: присвойте каждому элементу среднее геометрическое рангов, которых он достиг.

Мы могли бы использовать голосование [24]:

counter = Counter(features_selected_lists) # list of lists
features_voted = [k for k, v in counter.items() if v >= min_votes]

Хотя FSM не говорит вам, как ранжировать ваши функции, он поставляется с удобной функцией вывода, которая использует начальную загрузку и возвращает список функций, упорядоченных по их важности, для каждого из классификаторов и для каждой выборки. Вся предварительная обработка (дискретизация, нормализация (напомним, что chi2, например, не может обрабатывать отрицательные значения) и кодирование) выполняется внутри. В приведенном ниже примере я использовал слишком много выборок с размером выборки 100 наблюдений для каждой выборки.

selectors = FSM.FSM(k=20, filler = -1)
results = selectors.Bootstrapper(X_, y_, B=2,Sample_size=100)
# Results:
# {'ANOVA': [array(['loan_amnt', 'int_rate', 'annual_inc', 'delinq_2yrs',
#          'inq_last_6mths', 'mths_since_last_delinq',
#          'mths_since_last_record', 'open_acc', 'pub_rec', 'revol_bal',
#          'total_acc', 'out_prncp', 'out_prncp_inv', 'total_pymnt',
#          'total_pymnt_inv', 'total_rec_prncp', 'total_rec_late_fee',
#          'recoveries', 'collection_recovery_fee', 'last_pymnt_amnt'],
#         dtype=object),
#   array(['member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv',
#          'int_rate', 'annual_inc', 'inq_last_6mths',
#          'mths_since_last_record', 'open_acc', 'pub_rec', 'revol_bal',
#          'revol_util', 'out_prncp', 'out_prncp_inv', 'total_pymnt',
#          'total_pymnt_inv', 'total_rec_prncp', 'recoveries',
#          'collection_recovery_fee', 'last_pymnt_amnt'], dtype=object)],
#  'chi2': [array(['member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv',
#          'annual_inc', 'mths_since_last_delinq', 'mths_since_last_record',
#          'open_acc', 'revol_bal', 'total_acc', 'out_prncp', 'out_prncp_inv',
#          'total_pymnt', 'total_pymnt_inv', 'total_rec_prncp',
#           ...

Как оценить ансамбль селекторов функций

Обычно мы смотрим на три ключевых показателя эффективности: Разнообразие — например, в ансамблевых деревьях решений нам не нужны K разных деревьев, которые всегда дают одинаковые результаты, нам не нужны K разных селекторов, которые выбирают одни и те же функции независимо от данных. Еще одним KPI является стабильность. Мы должны гарантировать, что ансамбль будет возвращать аналогичные рейтинги для аналогичных наборов данных. Наконец, ваш KPI (это может быть точность, AUC или что-то еще). Использование избыточных функций может привести к ухудшению производительности, и мы должны ожидать лучших результатов от использования выбранного подмножества и более быстрого обучения.

Разнообразие Кунчева и Уитакер [25] представляют всесторонний обзор дополнительных мер для измерения разнообразия ансамблей селекторов признаков. Настройка такова, что у нас есть две или более обученные модели, где каждая из них обучена другому подмножеству признаков. У нас также есть их предсказания, где некоторые из них были правильными, некоторые неверными, некоторые были одинаковыми, а некоторые отличались. Они представляют и сравнивают 10 показателей разнообразия: Q-статистика, коэффициент корреляции, показатель несогласия, показатель двойной ошибки, дисперсия Кохави-Вольпарта, соглашение интерраторов, показатель энтропии, показатель сложности, обобщенное разнообразие и разнообразие совпадающих отказов. Тем не менее, поскольку эта статья стала слишком длинной, я пройдусь по Q-статистике, а остальное оставлю любопытному читателю.

Статистика Q представляет собой попарный тест. Учитывая два классификатора, у нас есть два предсказания Di длины N (что равно количеству наблюдений). Мы сопоставили их прогноз и использовали следующие обозначения:

Тогда Q-статистика для пары классификаторов будет

И если у нас есть L разных классификаторов, то мы вернем среднюю Q-статистику:

Для статистически независимых классификаторов математическое ожидание Q(i,j) равно 0. Q варьируется от -1 до 1. Классификаторы, которые склонны правильно распознавать одни и те же объекты, будут иметь положительные значения Q, а те, которые совершают ошибки на разных объектах, будут сделать Q отрицательным.

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

Существует несколько методов расчета стабильности (например, [26] и [27]. Приведу более свежий от [28]. Использование представления [29]: Допустим, у нас есть p исходных признаков, из которых мы хотим выбрать всего k признаков. Мы разбиваем наши данные на m различных подмножеств (или передискретизируем их). Определите h_j как количество раз, когда функция j выбирается как одна из k наиболее важных функций во всех m подмножествах. Определить q как сумму по p функциям (то есть подсчитывает, сколько раз была выбрана функция 1 + была выбрана функция 2 +… + была выбрана функция p), тогда следующее

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

Производительность — наша главная цель, и использование избыточных функций или просто неважных может снизить производительность нашей модели. Мы можем измерить успех метода отбора, посмотрев на наш выбранный KPI по сравнению с базовым сценарием, когда были введены все переменные. [24] проводят t-тесты для сравнения KPI модели после отбора и модели без нее.

Библиография

  1. Хопф, Константин и Саша Райфенрат. «Методы фильтрации для выбора функций в контролируемых приложениях машинного обучения — обзор и оценка». препринт arXiv arXiv:2111.12140 (2021 г.).
  2. Боммерт, Андреа и др. «Эталон методов фильтрации для выбора признаков в многомерных данных классификации». Вычислительная статистика и анализ данных 143 (2020): 106839.
  3. Ю, Лей и Хуан Лю. «Выбор функций для многомерных данных: быстрое решение для фильтрации на основе корреляции». Материалы 20-й международной конференции по машинному обучению (ICML-03). 2003.
  4. Пильненский, Никита и Иван Сметанниковы. «Алгоритмы выбора функций как один из инструментов анализа данных Python». Интернет будущего 12.3 (2020): 54.
  5. Росс, Шелдон М. Вводная статистика. Академическая пресса, 2017.
  6. MRMR объяснил, как именно вы хотели, чтобы вам объяснили, Самуэле Маццанти, Towards Data Science, Medium.
  7. Чжао, Чжэнью, Радхика Ананд и Мэллори Ван. «Методы выбора функций максимальной релевантности и минимальной избыточности для маркетинговой платформы машинного обучения». Международная конференция IEEE по науке о данных и расширенной аналитике (DSAA), 2019 г.. ИИЭР, 2019.
  8. Беннасар, Мохамед, Юлия Хикс и Россица Сечи. «Выбор признаков с использованием совместной максимизации взаимной информации». Экспертные системы с приложениями 42.22 (2015): 8520–8532.
  9. Мейер, Патрик Э. и Джанлука Бонтемпи. «Об использовании переменной комплементарности для выбора признаков в классификации рака». Семинары по применению эволюционных вычислений. Спрингер, Берлин, Гейдельберг, 2006.
  10. Баттити, Роберто. «Использование взаимной информации для выбора функций в контролируемом обучении нейронной сети». Транзакции IEEE в нейронных сетях 5.4 (1994): 537–550.
  11. Тесмер, Мишель и Пабло А. Эстевес. «AMIFS: адаптивный выбор функций с использованием взаимной информации». Международная совместная конференция IEEE по нейронным сетям, 2004 г. (кат. №04CH37541 IEEE). Том. 1. ИЭЭР, 2004.
  12. Ченг, Гронг и др. «Анализ выбора функций на основе условной взаимной информации для синергии и избыточности». Etri Journal 33.2 (2011): 210–218.
  13. Кира, Кенджи и Ларри А. Ренделл. «Практический подход к выбору функций». Машинное обучение, 1992 г.. Морган Кауфманн, 1992. 249–256.
  14. Робник-Шиконя, Марко и Игорь Кононенко. «Теоретический и эмпирический анализ ReliefF и RReliefF». Машинное обучение 53.1 (2003): 23–69.
  15. Урбанович, Райан Дж. и др. «Выбор функций на основе рельефа: введение и обзор». Журнал биомедицинской информатики 85 (2018): 189–203.
  16. Яш Дагли, Выбор функций с использованием алгоритмов рельефа на примере Python., Medium.
  17. Чен, Ренджи и др. «Контролируемый выбор признаков с помощью метода стратифицированного взвешивания признаков». Доступ IEEE 6 (2018): 15087–15098.
  18. Ван, Шипинг и Уильям Чжу. «Разреженный график с неконтролируемым выбором функций». Транзакции IEEE по системам, человеку и кибернетике: системы 48.3 (2016): 329–341.
  19. Чжао, Чжэн Алан и Хуан Лю. Выбор спектральных признаков для интеллектуального анализа данных. Тейлор и Фрэнсис, 2012 г.
  20. Ахиат, Ясин и др. «Новый подход к выбору признаков графа». 6-й Конгресс IEEE по информационным наукам и технологиям (CiSt), 2020 г.. ИИЭР, 2021.
  21. Чжан, Чжихун и Эдвин Р. Хэнкок. «Графический подход к выбору признаков». Международный семинар по графическим представлениям в распознавании образов. Спрингер, Берлин, Гейдельберг, 2011.
  22. Ху, Жунъяо и др. «Метод графического самопредставления для неконтролируемого выбора признаков». Нейрокомпьютинг 220 (2017): 130–137.
  23. Болон-Канедо, Вероника и Ампаро Алонсо-Бетансос. «Ансамбли для выбора функций: обзор и будущие тенденции». Information Fusion 52 (2019): 1–12.
  24. Коэн, Коэн и Атлас, Объединение методов выбора признаков, ватвенгеры, Medium.
  25. Кунчева, Людмила И. и Кристофер Дж. Уитакер. «Меры разнообразия в ансамблях классификаторов и их связь с точностью ансамбля». Машинное обучение 51.2 (2003): 181–207.
  26. Кунчева, Людмила И. «Показатель стабильности для выбора признаков». Искусственный интеллект и приложения. 2007.
  27. Юрман, Джузеппе и др. «Канберрское расстояние в ранжированных списках». Материалы продвижения в рейтинге семинара NIPS 09. Ситисир, 2009.
  28. Ногейра, Сара, Константинос Сечидис и Гэвин Браун. «Об устойчивости алгоритмов выбора признаков». Дж. Мах. Учиться. Рез. 18.1 (2017): 6345–6398.
  29. Хопф, Константин и Саша Райфенрат. «Методы фильтрации для выбора функций в контролируемых приложениях машинного обучения — обзор и оценка». препринт arXiv arXiv:2111.12140 (2021 г.).