Введение
В этом лабораторном задании демонстрируются два подхода к отбору признаков: модельный и последовательный отбор признаков. Цель - выбрать наиболее важные признаки из заданного набора данных. В качестве примера используется набор данных по диабету, состоящий из 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 для выбора признаков на основе важности. Последовательный селектор признаков - это жадный алгоритм, при котором на каждой итерации мы выбираем наилучший новый признак для добавления к нашим выбранным признакам на основе оценки кросс - валидации.