Предварительные требования: исчерпывающий/последовательный выбор функций

Feature Selection означает «выбор функций» :) Хорошо, это было легко! Однако я хочу поговорить о выполнении (последовательном или исчерпывающем) отборе функций, рассматривая некоторые функции вместе как одну группу.

Допустим, у вас есть данные со многими категориальными функциями, вы выполняете их горячее кодирование, и теперь вы получаете СЛИШКОМ много столбцов. Один из подходов к выбору функций — запустить модель машинного обучения с использованием нового набора функций и получить что-то вроде важности функций.

Другой подход состоит в том, чтобы выполнить выбор функций на исходных функциях, в то время как некоторые из них кодируются одним горячим кодированием! Допустим, мои данные имеют 5 функций {F1...F5}. И, F2 и F5 являются категоричными. Предположим, F2 содержит 5 различных категорий, а F5 содержит 10 различных категорий. Теперь, после горячего кодирования, у меня будет 18 признаков. Однако вместо того, чтобы выполнять выбор функций для этих 18 функций, я выполню выбор функций для {F1 [F2] F3, F4, [F5]}, где [F2] представляет группу функций с горячим кодированием, которые соответствуют категориальный признак F2, и, аналогично, [F5] — это группа признаков с горячим кодированием, которая соответствует категориальному признаку F5.

Для этого мы можем использовать недавно добавленный параметр `feature_groups` в модуле ExhaustiveFeatureSelection библиотеки mlxtend для выполнения такой задачи! Я хотел бы поблагодарить Себастьяна Рашку за его руководство и отзывы на протяжении всей разработки этой части библиотеки :)

Примечание. Если вы думаете "а как насчет последовательного выбора функций?" Что ж, хорошие новости! Это незавершенная работа! Вы можете отслеживать прогресс здесь:



Хорошо, вернемся к нашей теме. ..

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

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

Начнем

Шаг 0. Просмотрите данные!

Здесь я попытался упростить данные и оставить только четыре функции.

  • Функция «Embarked» является категориальной и содержит три отдельные категории C, Q и S. Таким образом, после преобразования каждой из них в новый столбец с помощью метода горячего кодирования данные будут иметь 3 новых функции, каждая из которых соответствует одной категорий C, Q, S.
  • Обратите внимание, что функция «Пол» содержит две категории мужчина/женщина. Следовательно, его можно преобразовать в один признак двоичного типа.
  • Также в признаке «Возраст» около 20% отсутствующих данных, и я решил рассмотреть бинарный показатель отсутствующего значения для этого признака.

Подводя итог, у меня будут следующие преобразования:

  • Пол → одна особенность бинарного типа
  • Age → сама фича Age и отсутствующий индикатор типа binary
  • Тариф → функция Тариф
  • Добавлено → 3 новых функции

Итак, всего у нас будет 1 + 2 + 1 + 3 = 7 признаков после преобразования.

Шаг 1. Преобразование данных с помощью прямого кодирования

Я уже преобразовал данные. Я использовал конвейер для преобразования своих данных. Я объяснял это в своей предыдущей статье. Если вы этого не знаете, не волнуйтесь. Я не буду говорить об этом здесь. Короче говоря, пайплайн — это, по сути, куча встречно-параллельных преобразователей, которые соединены друг с другом пайплайнами :) Хорошо, давайте посмотрим на данные после преобразований:

Обратите внимание, что данные теперь имеют 7 функций. Итак, нам нужно выполнить 2⁷-1 (127) различных комбинаций функций (почему? потому что для набора из 7 элементов всего есть 2⁷ подмножества. Однако нулевое подмножество здесь не имеет смысла. Таким образом, исключение этого приводит к 127 разные комбинации).

Хорошо, давайте сделаем это. В качестве нашего оценщика мы используем RandomForest от sklearn с настройками по умолчанию.

# install mlxtend libary
from mlxtend.feature_selection import ExhaustiveFeatureSelector as EFS
cv = 10
estimator = RandomForestClassifier()
max_features = df_new.shape[1]
efs = EFS(estimator, min_features=1, max_features=max_features, cv=cv, n_jobs=-1)
efs.fit(df_new, y)

И это занимает около ~ 75 сек.

Как насчет нашего группового выбора функций?

feature_groups = [[0],[1,2],[3,4,5],[6]] # defining groups
cv = 10
estimator = RandomForestClassifier()
max_features = df_new.shape[1]
efs_group = EFS(estimator, min_features=1,max_features=max_features, cv=cv, n_jobs=-1, feature_groups=feature_groups)
efs_group.fit(df_new, y)

Обратите внимание, что в этом подходе мы рассматриваем различные комбинации «групп» признаков. Например, если мы рассматриваем первую и вторую группы, это означает, что мы рассматриваем признаки [0] и признаки [1,2]. Другими словами, мы рассматриваем признаки [0,1,2].

И время выполнения составляет ~6 секунд. Хорошо! Это фантастика! А как насчет баллов?

Оценка каждого подмножества функций — это просто среднее значение перекрестной проверки для этого конкретного подмножества. Ниже я привожу результаты обычного ExhaustiveFeatureSelection (EFS) и группового ExhaustiveFeatureSelection (G-EFS).

Синие — это баллы, полученные из EFS, а красные — из G-FS. В первом, то есть EFS, оценка, показанная для каждого количества функций, является наивысшей оценкой, которую можно получить для этого количества функций. Например, для числа функций = 1 у нас есть 7 вариантов в EFS, мы можем выбрать функцию с индексом 0, или с индексом 1, …, или с индексом 6, следовательно, 7 вариантов. Тот, что показан на графике выше, является самым высоким, что соответствует признаку с индексом [0]. Например, подмножество [0, 6] — это то, которое дает наивысший балл, когда количество признаков = 2. Для G-EFS каждая красная точка соответствует наивысшему баллу из подмножества функций, созданного из того же количества групп! Например, есть четыре подмножества, которые можно создать только с одной группой признаков: [0], или [1,2], или [3,4,5], или [6]. Я выбрал тот, который имеет самый высокий балл. В качестве другого примера красный маркер с самой высокой точкой состоит из 5 функций. На самом деле выбранными признаками в этом случае являются [0, 3, 4, 5, 6], которые в основном образуются путем объединения трех групп признаков [0], [3,4,5] и [6]. Обратите внимание, что полученная оценка разумна с помощью G-EFS.

Кроме того, стоит отметить, что самый высокий балл в (обычной) EFS соответствует функциям [0, 4, 6]. Обратите внимание, что эти три функции включены в одну, полученную от G-EFS. Я не говорю, что так будет всегда; однако представляется возможным/разумным использовать EFS на наборе функций, полученных из G-EFS. Таким образом, можно выполнить EFS на [0,3,4,5,6]. Обратите внимание, что это комбинация 2⁵-1=31! Таким образом, он должен быть быстрее, чем EFS по всем функциям.

Я думаю, что это может стать полезным, когда такая же поддержка будет добавлена ​​в модуль последовательного выбора функций (SFS). Затем мы можем начать рассматривать возможность применения Group-Wise SFS к данным с большим количеством функций :)