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

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

Хотя термины «выбор признаков» и «извлечение признаков» иногда используются как синонимы, на самом деле это два разных метода. Выбор функций дает нам именно сами функции. Он не выполняет никаких преобразований или преобразований; он удаляет только ненужные в соответствии с заданными ограничениями. С другой стороны, при извлечении признаков мы не знаем, какие функции важнее других. Извлечение объектов преобразует объекты, создавая комбинацию объектов, которые представляют все объекты. Важность функции - это еще один термин, который часто появляется как подэтап в методах выбора функций, где функции сортируются в соответствии с их уровнем важности, то есть их вкладом в модель (выход).

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

Библиотека Sci-kit learn, самая популярная библиотека для науки о данных в Python, предлагает несколько полезных методов для выбора функций. Библиотека Boruta также предоставляет удобный, совместимый с scikit-learn api для алгоритма выбора функций Boruta. В основном мы сосредоточимся на упомянутых выше техниках.

Методы выбора объектов будут применены к набору алмазных данных от Seaborn. Для простоты мы удалили категориальные функции и разделили наши данные. Цена - целевая переменная.

import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
df = sns.load_dataset('diamonds')
df = df.drop(['cut', 'color', 'clarity'], axis = 1)
X = df.drop('price', axis = 1)
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2)

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

1 - BorutaPy

Boruta - это улучшенная Python-реализация пакета Boruta R. Мы будем использовать BorutaPy из библиотеки Boruta. BorutaPy - это алгоритм выбора функций, основанный на NumPy, SciPy и Sklearn.

Мы можем использовать BorutaPy, как и любой другой обучающийся scikit: fit, fit_transform и transform реализованы одинаково. BorutaPy нужен оценщик, и можно использовать метод ансамбля: случайный лес, дополнительный классификатор деревьев, даже деревья с градиентным усилением.

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

Он итеративно сравнивает важность исходных атрибутов с важностью их рандомизированных копий.

from sklearn.ensemble import RandomForestRegressor
from boruta import BorutaPy
forest = RandomForestRegressor(max_depth = 5)
feat_selector = BorutaPy(forest, n_estimators='auto', verbose=2, random_state=1)
feat_selector.fit(np.array(X_train), np.array(y_train))

После установки BorutaPy он предоставляет пользователю ранжирование функций. Подтвержденные - 1, предварительные - 2, а отклоненные - 3, на основе истории их важности функций на итерациях.

Важным моментом является то, что для BorutaPy мультиколлинеарность должна быть удалена перед запуском.

2— Рекурсивное исключение признаков (RFE)

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

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

В sklearn.feature_importance есть и другие варианты устранения рекурсивной функции;

RFECV
Recursive feature elimination with a built-in cross-validated selection of the best number of features.
SelectFromModel
Feature selection based on thresholds of importance weights.
SequentialFeatureSelector
Sequential cross-validation based feature selection. Does not rely on importance weights.

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

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
model = LinearRegression()
rfe = RFE(estimator = model, n_features_to_select = 5)
fit = rfe.fit(X_train, y_train)

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

Мы можем контролировать RFE в соответствии с коэффициентами модели линейной регрессии (мы можем сказать важность функции). Знак «z» - последний. Радио «Свобода» удалило символ «z».

3 - Одномерный выбор функций

Одномерный выбор функций работает путем выбора лучших функций на основе двумерных статистических тестов или одномерной статистики.

В sklearn есть разные одномерные методы выбора функций, мы сосредоточимся на наиболее часто используемых SelectKBest, в sklearn.feature_selection есть и другие методы;

SelectPercentile
Select features based on the percentile of the highest scores.
SelectFpr
Select features based on a false positive rate test.
SelectFdr
Select features based on an estimated false discovery rate.
SelectFwe
Select features based on family-wise error rate.
GenericUnivariateSelect
Univariate feature selector with configurable mode.

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

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

  • Для регрессии: f_regression, взаимная_инфо_регрессия
  • Для классификации: chi2, f_classif, duplic_info_classif

Эти функции используют некоторые тесты, f_regression использует тесты одномерной линейной регрессии, f_classif использует метод F-значения ANOVA, chi2 k-использует статистику хи-квадрат. Mutual_info_regression и Mutual_info_classif функции, основанные на оценке энтропии на основе расстояний k ближайших соседей.

SelectKBest принимает еще один параметр, k, помимо функции оценки. SelectKBest выставляет оценки на основе функции оценки и по очереди выбирает k функций.

from sklearn.feature_selection import SelectKBest, f_regression
selector = SelectKBest(score_func = f_classif, k = 5)
X_new = selector.fit_transform(X_train, y_train)
names = X_train.columns.values[selector.get_support()]
scores = selector.scores_[selector.get_support()]
names_scores = list(zip(names, scores))
ns_df = pd.DataFrame(data = names_scores, columns=['Feat_names', 'F_Scores'])
ns_df.sort_values('F_Scores', ascending=False)

SelectKBest помечает функции как True и False, в приведенном выше примере мы установили k равным 5. С тегом True мы получим 5 лучших атрибутов (самая сильная связь с выходными данными). Функция «глубина» помечена как «Ложь», потому что у нас есть 6 функций, а «глубина» является последней с точки зрения связи, определенной выбранным тестом.

Заключение

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

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

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

Ссылки

Https://www.semanticscholar.org/paper/Boruta-A-System-for-Feature-Selection-Kursa-Jankowski/85a8b1d9c52f9f795fda7e12376e751526953f38?p2df

Https://scikit-learn.org/stable/modules/feature_selection.html#feature-selection-as-part-of-a-pipeline

Https://github.com/hersany/DataScience/blob/master/Other/Feature_Selection.ipynb