FeatureSelector: отбор признаков для машинного обучения на Python

0
6740
Добавить в избранное

Поиск и отбор признаков в исходных данных является важнейшим этапом обучения. Рассмотрим 5 методов выборки и один удобный инструмент.

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Ненужные признаки снижают скорость обучения модели, интерпретируемость и, главное, способность к обобщению. FeatureSelector – это специальный класс для отбора информативных признаков, написанный на языке Python, реализующий самые распространенные методы выборки. Его исходный код доступен на GitHub. Инструмент позволяет оценивать параметры по следующим характеристикам:

  1. высокий процент пропущенных значений;
  2. коллинеарность (сильная корреляция);
  3. нулевая важность в моделях, основанных на деревьях;
  4. низкая важность;
  5. единственное значение.

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

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

Исходный набор данных

Для примера мы будем использовать данные из Kaggle-соревнования по вычислению кредитных рисков. Загрузить полный датасет можно здесь. Его структура представлена на изображении:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

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

Создание экземпляра

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

Убедитесь, что вы запускаете этот код в той же директории, что и feature_selector.py:

Методы

FeatureSelector имеет 5 методов для отбора неподходящих для обучения признаков. Любой идентифицированный объект можно удалить из набора вручную или с помощью функции remove. Мы разберем каждый метод и даже запустим их вместе.

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

Пропущенные значения

Первый метод осуществляет отбор признаков по очень простому алгоритму: подсчет количества пропущенных значений. Если оно превышает заданный порог, параметр рекомендуется удалить.

Этот код идентифицирует признаки, имеющие более 60% пропусков:

В этом фрейме показаны доли незаполненных значений для каждого параметра:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Чтобы увидеть удаляемые признаки, нужно обратиться к атрибуту ops класса FeatureSelector, который является словарем:

Построим график распределения пропущенных значений по всем атрибутам:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Коллинеарные признаки

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

Метод identify_collinear находит коллинеарные предикторы на основе заданного значения коэффициента корреляции. Для каждой пары коррелированных признаков он определяет один для удаления (так как нужно удалить только один):

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

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

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

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Можно также построить график всех корреляций в наборе, передав вызову plot_all=True:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Признаки с нулевой важностью

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

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

FeatureSelector устанавливает важность признаков с помощью алгоритма градиентного бустинга из библиотеки LightGBM. Показатель усредняется по 10 тренировочным прогонам GBM для уменьшения дисперсии. Кроме того, используется ранняя остановка с проверочным набором, чтобы предотвратить переобучение. Эту опцию можно отключить.

Приведенный ниже код производит отбор признаков с нулевой важностью:

Передаваемые параметры:

  • taskclassification или regression в зависимости от задачи;
  • eval_metric – метрика для ранней остановки (не требуется, если ранняя остановка отключена);
  • n_iterations – количество прогонов обучения для усреднения важности;
  • early_stopping – включение/отключение ранней остановки.

Построим с помощью plot_feature_importance два графика:

Здесь мы видим нормализованные показатели важности plot_n самых значимых признаков:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

На этом графике отражено изменение кумулятивной важности в зависимости от общего количества признаков. Вертикальная линия отмечает пороговое значение, в данном случае 99%.

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Две важные вещи, которые нужно помнить, производя отбор признаков по важности:

  1. Алгоритм градиентного бустинга является стохастическим. Это означает, что важность параметров будет меняться при каждом запуске модели. Отличия обычно некритичны, самые важные атрибуты не опустятся на последние места. Однако их порядок вполне может измениться, не удивляйтесь.
  2. Среди удаляемых могут оказаться признаки, закодированные с помощью алгоритма one-hot encoding, которые могут потребоваться для дальнейшего обучения.

Признаки с низкой важностью

Этот метод основан на предыдущем. Функция identify_low_importance находит параметры с наименьшей значимостью, которые не влияют на указанный общий уровень. Например, этот вызов отберет признаки, которые не вносят вклад в 99% общего значения:

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

Можно просмотреть все удаляемые объекты в датафрейме:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Функция low_importance основывается на том же подходе, что и метод главных компонент (PCA).

Отбор признаков по их важности применим только в случае использования решающего дерева для создания прогнозов. Помимо того, что эти методы являются стохастическими, они представляют собой черный ящик, поскольку мы не знаем, почему модель считает признаки неактуальными. Запустите их несколько раз, чтобы увидеть, как изменяются результаты, и создайте при необходимости несколько наборов данных с разными параметрами для тестирования!

Признаки с единственным значением

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

Этот метод не принимает никаких параметров для настройки:

Построим гистограмму количества уникальных значений для каждого признака:

FeatureSelector: эффективный отбор признаков для машинного обучения на Python

Помните, что Pandas отбрасывает значения NaN перед вычислением.

Удаление признаков

После того как отбор признаков осуществлен, их можно удалить двумя способами. Все параметры хранятся в словаре ops класса FeatureSelector, и их можно использовать для ручного удаления. Кроме того, существует встроенная функция remove, которая сделает все за вас.

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

Метод возвращает фрейм данных с удаленными параметрами. Можно также удалить one-hot признаки, созданные во время обучения:

Исходный набор данных всегда хранится в виде резервной копии в атрибуте data.

Отбор признаков всеми методами

Вместо отдельного использования разных методов, можно запустить их одновременно с помощью identify_all. Эта функция принимает словарь параметров:

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

Выводы

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

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

Помните, что вы можете внести свой вклад в развитие проекта FeatureSelector.

Перевод статьи William Koehrsen: A Feature Selection Tool for Machine Learning in Python

Другие интересные статьи по Data Science

Интересуетесь Data Science?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Оставьте комментарий