Отбор признаков — это процесс идентификации и выбора подмножества Признаков (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 означает отсутствие связи.
Библиотека 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
...
Тем не менее, мы можем видеть, что некоторые переменные имеют более высокие баллы, чем другие.
Мы также построили гистограмму коэффициентов важности:
Сократив число столбцов Датафрейма (Dataframe) до 10 самых важных признаков, мы и получим оптимизированный датасет для построения модели.
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
Автор оригинальной статьи: Jason Brownlee