Выбор функций, процесс поиска и выбора наиболее полезных функций в наборе данных, является важным шагом в конвейере машинного обучения. Ненужные функции снижают скорость обучения, уменьшают интерпретируемость модели и, прежде всего, снижают производительность обобщения на тестовом наборе. Таким образом, целью является очистка данных.
FeatureSelector включает в себя некоторые из наиболее распространенных методов выбора функций:
- Функции с высоким процентом пропущенных значений
- Коллинеарные характеристики (сильно коррелированные)
- Неважные функции в модели дерева
- Особенности низкой важности
- Функции с одним уникальным значением
В этой статье мы рассмотрим использование FeatureSelector на примере набора данных машинного обучения. Мы увидим, как это позволит нам быстро реализовать эти методы, обеспечивая более эффективный рабочий процесс.
Средство выбора функций предлагает пять способов поиска функций для удаления. Мы можем получить доступ к любым идентифицированным функциям и вручную удалить их из данных или использовать функцию удаления в селекторе функций.
Здесь мы рассмотрим каждый из методов идентификации, а также покажем, как все 5 можно выполнять одновременно. Кроме того, FeatureSelector имеет несколько возможностей построения графиков, поскольку визуальная проверка данных является важной частью машинного обучения.
Отсутствующие значения
Первый способ найти функции для удаления прост: найти функции с долей отсутствующих значений выше заданного порога. Приведенный ниже вызов идентифицирует функции с более чем 60 % пропущенных значений (жирным шрифтом выделены выходные данные).
fs.identify_missing (missing_threshold = 0,6)17 функций с более чем 0,60 пропущенными значениями.
Мы можем увидеть долю пропущенных значений в каждом столбце фрейма данных:
fs.missing_stats.head()
Чтобы увидеть функции, помеченные для удаления, мы обращаемся к атрибуту ops FeatureSelector, словарю Python с функциями, перечисленными в значениях.
missing_features = fs.ops['отсутствует']
недостающие_функции[:5]['OWN_CAR_AGE',
'ГОД_СТРОЙКИ_СРЕДНИЙ',
'ОБЩАЯ_ОБЛАСТЬ_AVG',
'ЭТАЖМИН_СРЕДНЕЕ',
'ЖИВАЯ КВАРТИРА_AVG']
Наконец, у нас есть график распределения пропущенных значений по функциям:
fs.plot_missing()

Коллинеарные столбцы
Коллинеарные признаки — это признаки, которые сильно коррелируют друг с другом. В машинном обучении это приводит к снижению производительности обобщения на тестовом наборе из-за высокой дисперсии и меньшей интерпретируемости модели.
Метод identity_collinear находит коллинеарные объекты с заданным значением коэффициента корреляция указано. Для каждой пары коррелированных функций он определяет одну из функций, которую необходимо удалить (поскольку нам нужно удалить только одну):
fs.identify_collinear (correlation_threshold = 0,98)21 функция с величиной корреляции более 0,98.
Аккуратная визуализация, которую мы можем сделать с корреляциями, — это тепловая карта. Это показывает все характеристики, которые имеют хотя бы одну корреляцию выше порога:
fs.plot_collinear()

Как и прежде, мы можем получить доступ к полному списку коррелированных функций, которые будут удалены, или просмотреть пары сильно коррелированных функций в базе данных.
# список коллинеарных объектов, которые необходимо удалить
collinear_features = fs.ops['коллинеарно']Кадр данных # коллинеарных функций
fs.record_collinear.head()

Если мы хотим исследовать наш набор данных, мы также можем построить все корреляции в данных, передав plot_all = True вызову:

Столбцы нулевой важности
Два предыдущих метода могут быть применены к любому набору структурированных данных и являются детерминированными: полученные результаты будет одинаковым каждый раз для данного порога. Следующий метод предназначен только для задач машинного обучения с учителем, когда у нас есть метки для обучения модели, и он не является детерминированным. Функция identity_zero_importance находит функции, которые не имеют значения в соответствии с моделью машинного обучения с градиентным усилением (GBM).
С помощью древовидных моделей машинного обучения, таких как повышающий набор, мы можем определить важность функций. Абсолютное значение важности не так важно, как относительные значения, которые мы можем использовать для определения наиболее важных функций для задачи. Мы также можем использовать важность функций для выбора функций, удаляя функции с нулевой важностью. В древовидной модели неважные функции не используются для разделения узлов, поэтому мы можем удалить их, не влияя на производительность модели.
FeatureSelector находит важность функций, используя машину улучшения градиента библиотеки LightGBM. Важность функций усредняется по 10 тренировочным прогонам GBM, чтобы уменьшить дисперсию. Кроме того, модель обучается с использованием ранней остановки с проверочным набором (есть возможность отключить это), чтобы избежать переобучения обучающих данных.
Код ниже вызывает метод и извлекает функции нулевой важности:
# Передайте соответствующие параметры
fs.identify_zero_importance (задача = «классификация»,
eval_metric = 'аук',
n_итераций = 10,
Early_stopping = Истина)# список функций нулевой важности
zero_importance_features = fs.ops['zero_importance']63 функции с нулевой важностью после горячего кодирования.
Параметры, которые мы передаем:
задача
: либо «классификация», либо « регрессия » соответствующий нашей задачеeval_metric
: метрика для использования при досрочном прекращении (бесполезно, если досрочное прекращение отключено)n_итераций
: количество тренировочных прогонов до средней важности функцийранняя_остановка
: использовать ли раннюю остановку для обучения модели
На этот раз мы получаем два графика с plot_feature_importances:
# отображает важность функций
fs.plot_feature_importances (порог = 0,99, plot_n = 12)124 функции, необходимые для 0,99 совокупной важности


Вверху у нас есть наиболее важные функции plot_n (построены с точки зрения нормализованной важности, где общее значение равно 1).
Внизу у нас есть совокупная важность по сравнению с количеством функций. Вертикальная линия проведена на совокупном пороге важности, в данном случае 99 %.
В отношении методов, основанных на важности, стоит помнить два замечания:
- Обучение машины повышения градиента является стохастическим, что означает, что важность функций будет меняться при каждом запуске модели.
Это не должно сильно повлиять (наиболее важные функции не станут вдруг наименее важными), но изменит порядок некоторых функций. Это также может повлиять на количество выявленных неважных функций. Не удивляйтесь, если важность функций каждый раз будет меняться!
- Для обучения модели машинного обучения функции сначала закодированы в горячем коде. Это означает, что некоторые из функций, идентифицированных как имеющие важность 0, могут быть добавлены в процессе моделирования в горячем коде.
Столбцы малой важности
Следующий метод основан на функции нулевой важности с использованием важности признаков модели для дальнейшего выбора. Функция идентификатора_low_importance находит наименее важные функции, которые не влияют на указанную общую важность.
Например, приведенный ниже вызов находит наименее важные функции, которые не требуются для достижения общей важности 99 %:
fs.identify_low_importance (кумулятивная_важность = 0,99)123 функции, необходимые для совокупной важности 0,99 после одного горячего кодирования.
116 функций не влияют на совокупную значимость 0,99.
Основываясь на графике совокупной важности и этой информации, машина повышения градиента считает, что многие функции не имеют отношения к обучению. Опять же, результаты этого метода будут меняться с каждой тренировкой.
Чтобы отобразить все значения функций в кадре данных:
fs.feature_importants.head(10)

Метод низкой значимости заимствован из одного из методов использования анализа главных компонентов (PCA), где обычно оставляют только PC, необходимые для сохранения определенного процента дисперсии (например, 95 % ). Учитываемый процент от общей важности основан на той же идее.
Методы, основанные на важности признаков, действительно применимы только в том случае, если мы собираемся использовать модель, основанную на дерево делать прогнозы. Помимо того, что они являются стохастическими, методы, основанные на важности, представляют собой подход черного ящика, поскольку мы действительно не знаем, почему модель считает признаки нерелевантными. Если вы используете эти методы, запустите их несколько раз, чтобы увидеть, как меняются результаты, и, возможно, создайте несколько наборов данных с разными параметрами для тестирования!
Столбцы с одним значением
Последний метод довольно прост: найти все столбцы, имеющие единственное уникальное значение. Функция только с одним уникальным значением не может быть полезна для машинного обучения, поскольку эта функция имеет нулевую дисперсию. Например, древовидная модель никогда не может разделить функцию с одним значением (поскольку нет групп, на которые можно разделить наблюдения).
Здесь нет параметров для выбора, в отличие от других методов:
fs.identify_single_unique()4 функции с одним уникальным значением.
Мы можем построить гистограмму количества уникальных значений в каждой категории:
fs.plot_unique()

Следует помнить, что NaN удаляются перед вычислением уникальных значений в Pandas по умолчанию.
Удалить столбцы
Как только мы определяем функции, которые нужно удалить, у нас есть два варианта их удаления. Все функции, которые нужно удалить, хранятся в ops dict FeatureSelector, и мы можем использовать списки для удаления функций вручную. Другой вариант — использовать встроенную функцию удаления.
Для этого метода мы передаем методы, используемые для удаления функций. Если мы хотим использовать все реализованные методы, мы просто передаем методы = 'все'.
# Удалить функции из всех методов (возвращает df)
train_removed = fs.remove (методы = 'все')['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] были запущены методы
Удалено 140 функций.
Этот метод возвращает фрейм данных с удаленными функциями. Чтобы также удалить функции горячего кода, созданные во время машинного обучения:
train_removed_all = fs.remove (методы = 'все', keep_one_hot = False)Удалено 187 функций, включая одноразовые функции.
Может быть хорошей идеей проверить, какие функции будут удалены, прежде чем продолжить! Исходный набор данных хранится в атрибуте данных FeatureSelector в качестве резервной копии!
Конвейер очистки данных
Вместо того, чтобы использовать методы по отдельности, мы можем использовать их все вместе с identity_all. Для каждого метода требуется словарь параметров:
fs.identify_all(selection_params = {'missing_threshold': 0,6,
'correlation_threshold': 0,98,
'задача': 'классифицировать',
'eval_metric': 'аук',
«кумулятивное_важность»: 0,99})Всего 151 функция из 255 идентифицирована для удаления после горячего кодирования.
Обратите внимание, что общее количество функций будет меняться по мере повторного запуска модели. Затем можно вызвать функцию удаления, чтобы удалить эти функции.
Класс Feature Selector реализует несколько общих операций для удаления функций перед обучением модели машинного обучения. Он предлагает функции для определения функций, которые необходимо удалить, а также визуализации. Методы можно запускать по отдельности или все сразу для повышения эффективности рабочих процессов.
Отсутствующие, коллинеарные и single_unique методы являются детерминированными, тогда как методы, основанные на важности признаков, меняются при каждом запуске. Выбор функций, как и в области машинного обучения, в значительной степени является эмпирическим и требует тестирования нескольких комбинаций, чтобы найти оптимальный ответ. Рекомендуется попробовать несколько конфигураций в конвейере, а средство выбора функций позволяет быстро оценить параметры выбора функций.