Найти тему

Feature Selection в Машинном обучении простыми словами

Фото: Jaël Vallée / Unsplash
Фото: Jaël Vallée / Unsplash

Отбор признаков — это процесс идентификации и выбора подмножества Признаков (Feature), наиболее релевантных Целевой переменной (Target Variable).

Самый простой случай отбора – числовые Предикторы (Predictor Variable) и числовая целевая переменная в случае Регрессии (Regression). Здесь легче рассчитать силу связи между каждой входной переменной и целевой. Мы и будем использовать синтетический набор данных в качестве основы для регрессионной Модели (Model). Задача регрессии — предсказать числовое значение целевого признака.

Функцию make_regression() библиотеки scikit-learn можно использовать для генерации набора данных регрессии. Он обеспечивает контроль над количеством Наблюдений (Observation), признаков и, что важно, количеством релевантных и избыточных входных признаков.

Для начала импортируем необходимые библиотеки:

from matplotlib import pyplot

from matplotlib.pyplot import figure

from sklearn.datasets import make_regression

from sklearn.feature_selection import SelectKBest, chi2, f_regression

from sklearn.model_selection import train_test_split

Мы сгенерируем Датасет (Dataset) с 1000 записями, каждая из которых имеет 100 предикторов, из которых 10 являются информативными, а остальные 90 избыточными:

X, y = make_regression(n_samples=1000, n_features=100, n_informative=10, noise=0.1, random_state=1)

Корреляция (Correlation) — мера взаимосвязи переменных друг с другом. Возможно, наиболее распространенной мерой корреляции является Коэффициент корреляция Пирсона (Pearson Correlation Coefficient), который предполагает Нормальное распределение (Normal Distribution) для каждой переменной и сообщает об их линейной зависимости.

Показатели линейной корреляции обычно представляют собой значение от -1 до 1, где 0 означает отсутствие связи.

-2

Библиотека scikit-learn обеспечивает реализацию корреляционной статистики в функции f_regression(). Эту функцию можно использовать в стратегии выбора признаков, например, при выборе k самых важных признаков (наибольшего значения) с помощью класса SelectKBest.

Например, мы можем определить класс SelectKBest для использования функции f_regression() и выбрать все функции, а затем преобразовать обучающие и тестовые наборы. Установим параметр k, равное 10, чтобы SelectKBest отобрал десять самых важных признаков:

fs = SelectKBest(score_func=f_regression, k=10)

fs.fit(X_train, y_train)

X_train_fs = fs.transform(X_train)

X_test_fs = fs.transform(X_test)

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

for i in range(len(fs.scores_)):

print('Признак %d: %f' % (i, fs.scores_[i]))

pyplot.bar([i for i in range(len(fs.scores_))], fs.scores_)

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

Признак 0: 0.009419

Признак 1: 1.018881

Признак 2: 1.205187

Признак 3: 0.000138

Признак 4: 0.167511

Признак 5: 5.985083

Признак 6: 0.062405

Признак 7: 1.455257

Признак 8: 0.420384

Признак 9: 101.392225

Признак 10: 0.387091

...

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

Мы также построили гистограмму коэффициентов важности:

-3

Сократив число столбцов Датафрейма (Dataframe) до 10 самых важных признаков, мы и получим оптимизированный датасет для построения модели.

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Автор оригинальной статьи: Jason Brownlee