Введение
В этом практическом занятии вы научитесь использовать метод последовательного уменьшения количества кандидатов для итеративного выбора наилучшей комбинации параметров из нескольких кандидатов. Этот метод реализован в классах HalvingGridSearchCV и HalvingRandomSearchCV из библиотеки Scikit-learn. В этом практическом занятии будет использоваться класс HalvingRandomSearchCV.
Советы по использованию ВМ
После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике в Jupyter Notebook.
Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импорт необходимых библиотек
В этом практическом занятии будут использоваться следующие библиотеки: pandas, numpy, matplotlib, sklearn.datasets, RandomForestClassifier, randint и HalvingRandomSearchCV. Импортируйте их с помощью следующего кода:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint
from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import HalvingRandomSearchCV
Загрузка набора данных
Функция make_classification из модуля sklearn.datasets используется для генерации набора данных для классификации. Набор данных содержит 400 образцов с 12 признаками. Код для загрузки набора данных выглядит следующим образом:
rng = np.random.RandomState(0)
X, y = datasets.make_classification(n_samples=400, n_features=12, random_state=rng)
Определение пространства параметров
Определите словарь param_dist, который содержит гиперпараметры и их соответствующие значения для поиска. Гиперпараметры: max_depth, max_features, min_samples_split, bootstrap и criterion. Диапазон поиска для max_features и min_samples_split определяется с использованием функции randint из модуля scipy.stats. Код для определения пространства параметров выглядит следующим образом:
param_dist = {
"max_depth": [3, None],
"max_features": randint(1, 6),
"min_samples_split": randint(2, 11),
"bootstrap": [True, False],
"criterion": ["gini", "entropy"],
}
Создание объекта последовательного случайного поиска
Создайте объект HalvingRandomSearchCV для поиска по пространству параметров. Объект принимает следующие аргументы:
estimator: оцениваемая модель, которую нужно оптимизироватьparam_distributions: пространство параметров для поискаfactor: коэффициент, на который количество кандидатов уменьшается на каждой итерацииrandom_state: случайное состояние, используемое для поиска
Код для создания объекта выглядит следующим образом:
clf = RandomForestClassifier(n_estimators=20, random_state=rng)
rsh = HalvingRandomSearchCV(
estimator=clf, param_distributions=param_dist, factor=2, random_state=rng
)
Настройка объекта последовательного случайного поиска
Настройте объект HalvingRandomSearchCV на наборе данных с использованием метода fit. Код для настройки объекта выглядит следующим образом:
rsh.fit(X, y)
Анализ результатов
Атрибут cv_results_ объекта поиска содержит результаты поиска. Преобразуйте его в датафрейм pandas с использованием следующего кода:
results = pd.DataFrame(rsh.cv_results_)
Столбец params_str создается путем преобразования столбца params в строку. Удалите дублирующие строки, у которых одинаковые значения params_str и iter:
results["params_str"] = results.params.apply(str)
results.drop_duplicates(subset=("params_str", "iter"), inplace=True)
Затем средние тестовые оценки поворачиваются относительно номера итерации и комбинации параметров с использованием метода pivot:
mean_scores = results.pivot(
index="iter", columns="params_str", values="mean_test_score"
)
Наконец, постройте график средних тестовых оценок по итерациям с использованием следующего кода:
ax = mean_scores.plot(legend=False, alpha=0.6)
labels = [
f"iter={i}\nn_samples={rsh.n_resources_[i]}\nn_candidates={rsh.n_candidates_[i]}"
for i in range(rsh.n_iterations_)
]
ax.set_xticks(range(rsh.n_iterations_))
ax.set_xticklabels(labels, rotation=45, multialignment="left")
ax.set_title("Scores of candidates over iterations")
ax.set_ylabel("mean test score", fontsize=15)
ax.set_xlabel("iterations", fontsize=15)
plt.tight_layout()
plt.show()
Интерпретация результатов
График показывает средние тестовые оценки кандидатов по итерациям. На первой итерации все кандидаты оцениваются с небольшим количеством ресурсов. На второй итерации оцениваются только лучшие половина кандидатов с удвоенным количеством ресурсов. Этот процесс повторяется до последней итерации, на которой остается только 2 кандидата. Лучшим кандидатом является тот, у которого наибольшая средняя тестовая оценка на последней итерации.
Резюме
В этом практическом занятии вы узнали, как использовать метод последовательного усечения для итеративного выбора наилучшей комбинации параметров из нескольких кандидатов. Класс HalvingRandomSearchCV из библиотеки Scikit-learn был использован для реализации метода поиска. Результаты поиска были проанализированы и интерпретированы с использованием графика средних тестовых оценок по итерациям.