Важность признаков с использованием случайного леса

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии мы будем использовать случайный лес для оценки важности признаков на искусственном задаче классификации. Мы сгенерируем синтетический датасет с только 3 информативными признаками. Будут построены важности признаков леса, а также их изменчивость между деревьями, представленная отклонениями от среднего.

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

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49132{{"Важность признаков с использованием случайного леса"}} sklearn/model_selection -.-> lab-49132{{"Важность признаков с использованием случайного леса"}} sklearn/inspection -.-> lab-49132{{"Важность признаков с использованием случайного леса"}} sklearn/datasets -.-> lab-49132{{"Важность признаков с использованием случайного леса"}} ml/sklearn -.-> lab-49132{{"Важность признаков с использованием случайного леса"}} end

Импорт библиотек

Мы импортируем необходимые библиотеки для этого лабораторного занятия.

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