Отбор признаков на основе модели и последовательный отбор признаков

Beginner

This tutorial is from open-source community. Access the source code

Введение

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

Советы по использованию ВМ

После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Загрузка данных

Мы загружаем набор данных по диабету из scikit - learn и выводим его описание.

from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
print(diabetes.DESCR)

Важность признаков по коэффициентам

Для оценки важности признаков мы используем оценщик RidgeCV. Признаки с наибольшим абсолютным значением coef_ считаются самыми важными.

from sklearn.linear_model import RidgeCV

ridge = RidgeCV(alphas=np.logspace(-6, 6, num=5)).fit(X, y)
importance = np.abs(ridge.coef_)
feature_names = np.array(diabetes.feature_names)
plt.bar(height=importance, x=feature_names)
plt.title("Feature importances via coefficients")
plt.show()

Выбор признаков на основе важности

Мы выбираем два наиболее важных признака в соответствии с коэффициентами, используя SelectFromModel. SelectFromModel принимает параметр threshold и будет выбирать признаки, важность которых (определяемая коэффициентами) выше этого порога.

from sklearn.feature_selection import SelectFromModel

threshold = np.sort(importance)[-3] + 0.01

sfm = SelectFromModel(ridge, threshold=threshold).fit(X, y)
print(f"Features selected by SelectFromModel: {feature_names[sfm.get_support()]}")

Выбор признаков с использованием последовательного отбора признаков

Мы используем последовательный селектор признаков (Sequential Feature Selector, SFS) для выбора признаков. SFS - это жадный алгоритм, при котором на каждой итерации мы выбираем наилучший новый признак для добавления к нашим выбранным признакам на основе оценки кросс - валидации. Также мы можем идти в обратном направлении (обратный SFS), то есть начинать с всех признаков и жадно выбирать признаки для удаления по одному.

from sklearn.feature_selection import SequentialFeatureSelector

sfs_forward = SequentialFeatureSelector(ridge, n_features_to_select=2, direction="forward").fit(X, y)
sfs_backward = SequentialFeatureSelector(ridge, n_features_to_select=2, direction="backward").fit(X, y)

print(f"Features selected by forward sequential selection: {feature_names[sfs_forward.get_support()]}")
print(f"Features selected by backward sequential selection: {feature_names[sfs_backward.get_support()]}")

Резюме

В этом практическом занятии были показаны два подхода к отбору признаков: отбор на основе модели и последовательный отбор признаков. Мы использовали оценщик RidgeCV для определения важности признаков и SelectFromModel для выбора признаков на основе важности. Последовательный селектор признаков - это жадный алгоритм, при котором на каждой итерации мы выбираем наилучший новый признак для добавления к нашим выбранным признакам на основе оценки кросс - валидации.