Введение
В этом лабораторном занятии мы будем использовать случайный лес для оценки важности признаков на искусственном задаче классификации. Мы сгенерируем синтетический датасет с только 3 информативными признаками. Будут построены важности признаков леса, а также их изменчивость между деревьями, представленная отклонениями от среднего.
Советы по использованию ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук, чтобы получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импорт библиотек
Мы импортируем необходимые библиотеки для этого лабораторного занятия.
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
import pandas as pd
import numpy as np
import time
Генерация данных
Мы сгенерируем синтетический датасет с только 3 информативными признаками. Мы явно не перемешаем датасет, чтобы убедиться, что информативные признаки соответствуют первым трем столбцам X. Кроме того, мы разделим наш датасет на тренировочную и тестовую подмножества.
X, y = make_classification(
n_samples=1000,
n_features=10,
n_informative=3,
n_redundant=0,
n_repeated=0,
n_classes=2,
random_state=0,
shuffle=False,
)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
Обучение случайного леса
Мы обучим классификатор случайного леса для вычисления важности признаков.
feature_names = [f"признак {i}" for i in range(X.shape[1])]
forest = RandomForestClassifier(random_state=0)
forest.fit(X_train, y_train)
Важность признаков на основе среднего уменьшения нечистоты
Важность признаков предоставляется атрибутом feature_importances_ обученной модели, и она вычисляется как среднее и стандартное отклонение накопления уменьшения нечистоты внутри каждого дерева. Мы построим график важности признаков, основанный на нечистоте.
start_time = time.time()
importances = forest.feature_importances_
std = np.std([tree.feature_importances_ for tree in forest.estimators_], axis=0)
elapsed_time = time.time() - start_time
print(f"Время, затраченное на вычисление важностей: {elapsed_time:.3f} секунд")
forest_importances = pd.Series(importances, index=feature_names)
fig, ax = plt.subplots()
forest_importances.plot.bar(yerr=std, ax=ax)
ax.set_title("Важность признаков с использованием MDI")
ax.set_ylabel("Среднее уменьшение нечистоты")
fig.tight_layout()
Важность признаков на основе перестановки признаков
Важность признаков при перестановке преодолевает ограничения важности признаков, основанной на нечистоте: они не имеют предвзятости по отношению к признакам с высокой基数 и могут быть вычислены на оставшемся тестовом наборе. Мы вычислим полную важность при перестановке. Признаки перемешиваются n раз, и модель переобучается для оценки их важности. Мы построим график ранжирования важности.
start_time = time.time()
result = permutation_importance(
forest, X_test, y_test, n_repeats=10, random_state=42, n_jobs=2
)
elapsed_time = time.time() - start_time
print(f"Время, затраченное на вычисление важностей: {elapsed_time:.3f} секунд")
forest_importances = pd.Series(result.importances_mean, index=feature_names)
fig, ax = plt.subplots()
forest_importances.plot.bar(yerr=result.importances_std, ax=ax)
ax.set_title("Важность признаков с использованием перестановки на всей модели")
ax.set_ylabel("Среднее уменьшение точности")
fig.tight_layout()
plt.show()
Резюме
В этом практическом занятии мы сгенерировали синтетический датасет с только 3 информативными признаками и использовали случайный лес для оценки важности признаков. Мы построили график важности признаков леса, а также их изменчивость между деревьями, представленную отклонениями. Мы использовали важность, основанную на нечистоте, и важность признаков при перестановке для вычисления важности признаков. При обоих методах были выявлены одни и те же признаки, как наиболее важные.