www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Инструмент выбора функций для машинного обучения в Python

Дата публикации Jun 22, 2018

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

Расстроенный методами выбора специальных функций, которые я снова и снова применял для решения задач машинного обучения, я создал класс для выбора функций в Pythonдоступно на GitHub,FeatureSelectorвключает в себя некоторые из наиболее распространенных методов выбора функций:

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

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

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


Пример набора данных

Для этого примера мы будем использовать образец данных изHome Credit Default Конкурс машинного обучения рискуна Kaggle. (Чтобы начать соревнование, смотритеЭта статья). Весь набор данныхдоступно для скачиванияи здесь мы будем использовать образец в целях иллюстрации.

Пример данных. TARGET - это ярлык для классификации

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

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

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

(Обязательно запустите это в том же каталоге, что иfeature_selector.py)

from feature_selector import FeatureSelector# Features are in train and labels are in train_labels
fs = FeatureSelector(data = train, labels = train_labels)

методы

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

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

Недостающие ценности

Первый метод поиска объектов, которые нужно удалить, прост: найти объекты, у которых доля пропущенных значений превышает определенный порог. Вызов ниже определяет функции с более чем 60% пропущенных значений (смелыйэто выход).

fs.identify_missing(missing_threshold = 0.6)17 features with greater than 0.60 missing values.

Мы можем видеть долю пропущенных значений в каждом столбце в кадре данных:

fs.missing_stats.head()

Чтобы увидеть функции, определенные для удаления, мы получаем доступ кopsатрибутFeatureSelector, Python dict с функциями в виде списков в значениях.

missing_features = fs.ops['missing']
missing_features[:5]['OWN_CAR_AGE',
'YEARS_BUILD_AVG',
'COMMONAREA_AVG',
'FLOORSMIN_AVG',
'LIVINGAPARTMENTS_AVG']

Наконец, у нас есть график распределения отсутствующих значений по всем признакам:

fs.plot_missing()

Коллинеарные особенности

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

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

fs.identify_collinear(correlation_threshold = 0.98)21 features with a correlation magnitude greater than 0.98.

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

fs.plot_collinear()

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

# list of collinear features to remove
collinear_features = fs.ops['collinear']# dataframe of collinear features
fs.record_collinear.head()

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

Функции с нулевым значением

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

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

FeatureSelectorнаходит значения функций с помощью машины повышения градиента изБиблиотека LightGBM, Значения функций усредняются за 10 тренировочных прогонов GBM, чтобы уменьшить дисперсию. Кроме того, модель обучается с использованием ранней остановки с набором проверки (есть возможность отключить это), чтобы предотвратить наложение на тренировочные данные.

Код ниже вызывает метод и извлекает функции нулевой важности:

# Pass in the appropriate parameters
fs.identify_zero_importance(task = 'classification',
eval_metric = 'auc',
n_iterations = 10,
early_stopping = True)# list of zero importance features
zero_importance_features = fs.ops['zero_importance']63 features with zero importance after one-hot encoding.

Параметры, которые мы передаем, следующие:

  • task: либо «классификация», либо «регрессия», соответствующая нашей проблеме
  • eval_metric: метрика для ранней остановки (не требуется, если ранняя остановка отключена)
  • n_iterations: количество тренировочных прогонов для усреднения значений функций по
  • early_stopping: использовать ли раннюю остановку для обучения модели

На этот раз мы получаем два участка сplot_feature_importances:

# plot the feature importances
fs.plot_feature_importances(threshold = 0.99, plot_n = 12)124 features required for 0.99 of cumulative importance

Слева у нас естьplot_nнаиболее важные особенности (нанесены в терминах нормированной важности, где общая сумма равна 1). Справа у нас есть совокупное значение по сравнению с количеством функций. Вертикальная линия рисуется вthresholdсовокупной важности, в данном случае 99%.

Два примечания хорошо запомнить для методов, основанных на важности:

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

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

  • Для обучения модели машинного обучения, функции в первую очередьзакодированный горячим способом, Это означает, что некоторые функции, определенные как имеющие значение 0, могут быть объектами с горячим кодированием, добавленными во время моделирования.

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

Особенности низкого значения

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

Например, вызов ниже находит наименее важные функции, которые не требуются для достижения 99% общей важности:

fs.identify_low_importance(cumulative_importance = 0.99)123 features required for cumulative importance of 0.99 after one hot encoding.
116 features do not contribute to cumulative importance of 0.99.

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

Чтобы просмотреть все значения функций в кадре данных:

fs.feature_importances.head(10)

low_importanceМетод заимствует из одного из методовс использованием анализа основных компонентов (PCA)где обычно хранится только ПК, необходимый для сохранения определенного процента дисперсии (например, 95%). Процентная доля общей важности основана на той же идее.

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

Единственные уникальные значения

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

Здесь нет параметров для выбора, в отличие от других методов:

fs.identify_single_unique()4 features with a single unique value.

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

fs.plot_unique()

Один момент, который нужно помнить,NaNsупали довычисление уникальных значений в Pandas по умолчанию.

Удаление функций

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

Для этого метода мы передаемmethodsиспользовать для удаления функций Если мы хотим использовать все реализованные методы, мы просто передаемmethods = 'all',

# Remove the features from all methods (returns a df)
train_removed = fs.remove(methods = 'all')['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run

Removed 140 features.

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

train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)Removed 187 features including one-hot features.

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

Запуск всех методов одновременно

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

fs.identify_all(selection_params = {'missing_threshold': 0.6,    
'correlation_threshold': 0.98,
'task': 'classification',
'eval_metric': 'auc',
'cumulative_importance': 0.99})151 total features out of 255 identified for removal after one-hot encoding.

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

Выводы

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

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

Как всегда, я приветствую отзывы и конструктивную критику. Я хочу подчеркнуть, что я ищу помощь вFeatureSelector, Любой можетвнести свой вклад в GitHubи я ценю советы от тех, кто просто использует инструмент! Я также могу быть достигнут в Твиттере@koehrsen_will,

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map