Выбрано с GitHub, скомпилировано сердцем машины.
Учитывая важность выбора функций в процессе машинного обучения, специалист по данным Уильям Кёрсен недавно опубликовал на GitHub класс Python для селектора функций, чтобы помочь исследователям более эффективно выполнять выбор функций. Эта статья представляет собой введение в проект и демонстрационную статью, написанную Кёрсеном.
адрес проекта:GitHub.com/will KO, а окрашивание…
Выбор функций, процесс поиска и выбора наиболее полезных функций в наборе данных, является ключевым этапом в процессе машинного обучения. Ненужные функции замедляют обучение, снижают интерпретируемость модели и, что наиболее важно, снижают эффективность ее обобщения на тестовом наборе.
Существуют специальные методы выбора признаков, и мне часто приходится снова и снова применять их к задачам машинного обучения, что утомительно. Поэтому я создал класс выбора функций на Python и сделал его доступным на GitHub. Этот FeatureSelector содержит некоторые из наиболее распространенных методов выбора функций:
1. Функции с высоким процентом пропущенных значений
2. Коллинеарные (сильно коррелированные) признаки
3. Функции с нулевой важностью в древовидных моделях
4. Менее важные функции
5. Функции с одним уникальным значением
В этой статье мы рассмотрим весь процесс использования FeatureSelector на примере набора данных машинного обучения. Мы увидим, как эти методы можно быстро реализовать, что приведет к более эффективному рабочему процессу.
Полный код доступен на GitHub, каждый может внести свой вклад. Этот селектор функций находится в стадии разработки и будет продолжать улучшаться в зависимости от потребностей сообщества!
пример набора данных
Чтобы продемонстрировать, мы будем использовать образец данных из конкурса машинного обучения Kaggle «Риск дефолта по кредиту для домашних хозяйств». Узнайте о конкурсе по адресу:к data science.com/machine-ahhh…, полный набор данных можно скачать здесь:woohoo.kareformed.com/from/home-fire…. Здесь мы будем использовать некоторые образцы данных для демонстрации.
Это соревнование представляет собой задачу контролируемой классификации, которая также является очень подходящим набором данных, поскольку в нем много пропущенных значений, большое количество сильно коррелированных (коллинеарных) признаков и некоторые нерелевантные признаки, которые не помогают моделям машинного обучения.
Создать экземпляр
Чтобы создать экземпляр класса 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)
метод
Этот селектор функций имеет 5 методов поиска функций, которые нужно удалить. Мы можем получить доступ к любым идентифицированным функциям и вручную удалить их из данных, или мы можем использовать функцию удаления в FeatureSelector.
Здесь мы опишем каждый из этих методов распознавания и покажем, как запустить все 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, а функции представлены в виде списка.
missing_features = fs.ops['missing']
missing_features[:5]
['OWN_CAR_AGE',
'YEARS_BUILD_AVG',
'COMMONAREA_AVG',
'FLOORSMIN_AVG',
'LIVINGAPARTMENTS_AVG']
Наконец, мы можем построить распределение пропущенных значений для всех функций:
fs.plot_missing()
Коллинеарные функции
Коллинеарные признаки — это признаки, которые сильно коррелируют друг с другом. В области машинного обучения высокая дисперсия и низкая интерпретируемость модели приводят к уменьшению обобщения на тестовом наборе.
Метод identity_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:
функции нулевой важности
Первые два метода можно применять к любому структурированному набору данных, и результаты являются детерминированными — для заданного порога результаты всегда одинаковы. Следующий подход предназначен для задач контролируемого машинного обучения, где у нас есть метки обученной модели и они недетерминированы. Функция identity_zero_importance может находить функции с нулевой важностью в соответствии с моделью обучения машины повышения градиента (GBM).
Мы можем использовать древовидные модели машинного обучения, такие как повышающий ансамбль, чтобы определить важность функций. Абсолютное значение этой важности менее важно, чем относительное значение, которое мы можем использовать для определения наиболее важных функций для задачи. Мы также можем использовать важность функций при выборе функций, удаляя функции с нулевой важностью. В древовидных моделях функции нулевой важности не используются для разделения каких-либо узлов, поэтому мы можем удалить их, не влияя на производительность модели.
FeatureSelector может использовать машину повышения градиента из библиотеки LightGBM, чтобы получить важность функций. Чтобы уменьшить дисперсию, полученная важность признаков усредняется по 10 эпохам обучения GBM. Кроме того, модель обучается с ранней остановкой (эту опцию также можно отключить), чтобы предотвратить переоснащение обучающих данных.
Библиотека LightGBM:lightgbm.readthedocs.io/
Следующий код вызывает этот метод и извлекает функции нулевой важности:
# 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.
Параметры, которые мы передаем, объясняются следующим образом:
- задача: либо "классификация", либо "регрессия" в зависимости от нашего вопроса
- 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). Правый график представляет собой совокупную важность соответствующего количества признаков. Вертикальная синяя линия отмечает порог совокупной важности 99%.
Что касается методов, основанных на важности, следует помнить о двух вещах:
- Обучение машины повышения градиента является стохастическим, что означает, что важность функции меняется после каждого запуска модели.
Это не должно иметь большого влияния (самая важная функция не становится внезапно наименее важной), но меняет порядок некоторых функций, а также влияет на количество выявленных функций нулевой важности. Не удивляйтесь, если важность функции меняется каждый раз!
- Для обучения модели машинного обучения функции сначала кодируются в горячем режиме. Это означает, что некоторые признаки, идентифицированные как нулевые, могут быть однократно закодированными признаками, добавленными в процессе моделирования.
Когда мы достигаем этапа удаления функций, также есть возможность удалить любые добавленные функции горячего кодирования. Однако, если мы собираемся заниматься машинным обучением после выбора функций, нам все равно придется закодировать эти функции в горячем режиме.
функции низкой важности
Следующий метод основан на функции нулевой важности, использующей важность признаков из модели для дальнейшего выбора. Функция identity_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%). Процент общей важности, который следует учитывать, основан на той же идее.
Методы, основанные на важности признаков, действительно полезны только тогда, когда мы собираемся использовать древовидную модель для прогнозирования. Помимо случайных результатов, методы, основанные на важности, являются методами черного ящика, а это означает, что мы на самом деле не знаем, почему модель считает определенные функции нерелевантными. Если вы используете эти методы, запустите их несколько раз, чтобы увидеть, как меняются результаты, возможно, создайте несколько наборов данных с разными параметрами для тестирования!
единственная уникальная ценность
Последний метод довольно прост: найти любой столбец с единственным уникальным значением. Функция только с одним уникальным значением не может использоваться для машинного обучения, поскольку дисперсия этой функции равна 0. Например, если функция имеет только одно значение, то древовидная модель никогда не сможет различить (поскольку нет основы для различения).
В отличие от других методов, этот метод не имеет необязательных параметров:
fs.identify_single_unique()
4 features with a single unique value.
Мы можем построить гистограмму количества уникальных значений для каждой категории:
fs.plot_unique()
Еще одна вещь, о которой следует помнить, NaN уже удаляются по умолчанию с помощью Pandas перед вычислением уникальных значений.
удалить функцию
После определения функций, которые нужно удалить, у нас есть два варианта их удаления. Все функции, которые нужно удалить, хранятся в словаре операций FeatureSelector, и мы можем использовать этот список, чтобы удалить их вручную или, конечно, с помощью встроенной функции удаления.
Для этого метода нам нужно передать методы, которые мы хотим использовать для удаления функций. Если мы хотим использовать все реализованные методы, мы просто используем методы = 'все'
# 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.
Перед выполнением операции рекомендуется проверить функции, которые будут удалены! Исходный набор данных будет сохранен в свойстве данных FeatureSelector в качестве резервной копии!
запустить все методы сразу
Вместо того, чтобы использовать каждый метод по отдельности, мы можем использовать identity_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.
Обратите внимание, что общее количество функций в нескольких запусках модели также может различаться. Затем вы можете вызвать функцию удаления, чтобы удалить эти функции.
Суммировать
Этот класс селектора функций реализует несколько общих операций по удалению функций перед обучением модели машинного обучения. Он предоставляет функции, которые можно использовать для идентификации функций, которые необходимо удалить, а также функции визуализации. Эти методы можно использовать по отдельности или все сразу для повышения эффективности рабочего процесса.
Отсутствующие, коллинеарные и single_unique методы являются детерминированными, в то время как методы, основанные на важности признаков, варьируются от запуска к запуску. Как и в области машинного обучения, выбор функций в значительной степени является эмпирическим, требуя тестирования нескольких комбинаций, чтобы найти оптимальное решение. Лучше всего попробовать несколько конфигураций в процессе, а FeatureSelector предоставляет метод для быстрой оценки параметров выбора функций.
Оригинальная ссылка:к data science.com/ah-feature-is…