Введение
В этом практическом занятии мы пройдем по шагам реализации Метода рекурсивного исключения признаков с использованием кросс-валидации (RFECV) с использованием scikit-learn. RFECV используется для выбора признаков, что представляет собой процесс выбора подмножества значимых признаков для использования в построении модели. Мы будем использовать задачу классификации с 15 признаками, из которых 3 информативных, 2 избыточных и 10 неинформативных.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы столкнетесь с проблемами во время обучения, не стесняйтесь задавать вопросы Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Генерация данных
Мы сгенерируем задачу классификации с использованием функции make_classification из scikit-learn. Мы сгенерируем 500 выборок с 15 признаками, из которых 3 информативных, 2 избыточных и 10 неинформативных.
from sklearn.datasets import make_classification
X, y = make_classification(
n_samples=500,
n_features=15,
n_informative=3,
n_redundant=2,
n_repeated=0,
n_classes=8,
n_clusters_per_class=1,
class_sep=0.8,
random_state=0,
)
Обучение и выбор модели
Мы создадим объект RFECV и вычислим кросс-валидированные оценки. Стратегия оценивания "accuracy" оптимизирует долю правильно классифицированных выборок. Мы будем использовать логистическую регрессию в качестве оценщика и стратифицированную k-кратную кросс-валидацию с 5 фолдами.
from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
min_features_to_select = 1 ## Минимальное количество признаков для рассмотрения
clf = LogisticRegression()
cv = StratifiedKFold(5)
rfecv = RFECV(
estimator=clf,
step=1,
cv=cv,
scoring="accuracy",
min_features_to_select=min_features_to_select,
n_jobs=2,
)
rfecv.fit(X, y)
print(f"Optimal number of features: {rfecv.n_features_}")
Построение графика количества признаков по сравнению с результатами кросс-валидации
Мы построим график количества выбранных признаков по сравнению с результатами кросс-валидации. Для создания графика мы будем использовать matplotlib.
import matplotlib.pyplot as plt
n_scores = len(rfecv.cv_results_["mean_test_score"])
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Mean test accuracy")
plt.errorbar(
range(min_features_to_select, n_scores + min_features_to_select),
rfecv.cv_results_["mean_test_score"],
yerr=rfecv.cv_results_["std_test_score"],
)
plt.title("Recursive Feature Elimination \nwith correlated features")
plt.show()
Резюме
В этом практическом занятии мы прошли процесс реализации Метода рекурсивного исключения признаков с использованием кросс-валидации (RFECV) с использованием scikit-learn. Мы сгенерировали задачу классификации с 15 признаками, из которых 3 были информативными, 2 были избыточными и 10 были неинформативными. Мы использовали логистическую регрессию в качестве оценщика и стратифицированную k-кратную кросс-валидацию с 5 фолдами. Мы построили график количества выбранных признаков по сравнению с результатами кросс-валидации. Мы обнаружили, что оптимальное количество признаков было равно 3, что соответствовало истинной генеративной модели. Мы также заметили участок равных оценок для 3 - 5 выбранных признаков из-за введения коррелированных признаков.