Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы загрузить полный код примера. или запустить этот пример в браузере через JupyterLite или Binder

Итерации последовательного удвоения

В данном примере показано, как поиск последовательного удвоения (HalvingGridSearchCV и HalvingRandomSearchCV) итеративно выбирает лучшую комбинацию параметров из нескольких кандидатов.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.stats import randint

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.experimental import enable_halving_search_cv  # noqa
from sklearn.model_selection import HalvingRandomSearchCV

Сначала мы определяем пространство параметров и обучаем экземпляр HalvingRandomSearchCV.

rng = np.random.RandomState(0)

X, y = datasets.make_classification(n_samples=400, n_features=12, random_state=rng)

clf = RandomForestClassifier(n_estimators=20, random_state=rng)

param_dist = {
    "max_depth": [3, None],
    "max_features": randint(1, 6),
    "min_samples_split": randint(2, 11),
    "bootstrap": [True, False],
    "criterion": ["gini", "entropy"],
}

rsh = HalvingRandomSearchCV(
    estimator=clf, param_distributions=param_dist, factor=2, random_state=rng
)
rsh.fit(X, y)
HalvingRandomSearchCV(estimator=RandomForestClassifier(n_estimators=20,
                                                       random_state=RandomState(MT19937) at 0x7656B792F640),
                      factor=2,
                      param_distributions={'bootstrap': [True, False],
                                           'criterion': ['gini', 'entropy'],
                                           'max_depth': [3, None],
                                           'max_features': <scipy.stats._distn_infrastructure.rv_discrete_frozen object at 0x7656b789e5e0>,
                                           'min_samples_split': <scipy.stats._distn_infrastructure.rv_discrete_frozen object at 0x7656b5709610>},
                      random_state=RandomState(MT19937) at 0x7656B792F640)
В среде Jupyter, пожалуйста, перезапустите этот ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub, HTML-представление не может отобразиться, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
HalvingRandomSearchCV(estimator=RandomForestClassifier(n_estimators=20,
                                                       random_state=RandomState(MT19937) at 0x7656B792F640),
                      factor=2,
                      param_distributions={'bootstrap': [True, False],
                                           'criterion': ['gini', 'entropy'],
                                           'max_depth': [3, None],
                                           'max_features': <scipy.stats._distn_infrastructure.rv_discrete_frozen object at 0x7656b789e5e0>,
                                           'min_samples_split': <scipy.stats._distn_infrastructure.rv_discrete_frozen object at 0x7656b5709610>},
                      random_state=RandomState(MT19937) at 0x7656B792F640)
RandomForestClassifier(bootstrap=False, criterion='entropy', max_features=4,
                       min_samples_split=5, n_estimators=20,
                       random_state=RandomState(MT19937) at 0x7656C1BDF340)
RandomForestClassifier(bootstrap=False, criterion='entropy', max_features=4,
                       min_samples_split=5, n_estimators=20,
                       random_state=RandomState(MT19937) at 0x7656C1BDF340)


Теперь мы можем использовать атрибут cv_results_ поиска, чтобы проверить и построить эволюцию поиска.

results = pd.DataFrame(rsh.cv_results_)
results["params_str"] = results.params.apply(str)
results.drop_duplicates(subset=("params_str", "iter"), inplace=True)
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()
Scores of candidates over iterations

Количество кандидатов и объем ресурсов на каждой итерации

На первой итерации используется небольшое количество ресурсов. Ресурсом здесь является количество образцов, на которых обучаются оценщики. Все кандидаты оцениваются.

На второй итерации оценивается только лучшая половина кандидатов. Количество выделенных ресурсов удваивается: кандидаты оцениваются на удвоенном количестве образцов.

Этот процесс повторяется до последней итерации, где остаются только 2 кандидата. Лучший кандидат — это кандидат, имеющий лучший результат на последней итерации.

Общее время выполнения скрипта: (0 минут 5.938 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_successive_halving_iterations.ipynb

Download Python source code: plot_successive_halving_iterations.py

Download zipped: plot_successive_halving_iterations.zip

Связанные примеры

Сравнение поиска сетки и последовательного удвоения

Основные моменты выпуска scikit-learn 0.24

Сравнение случайного поиска и поиска по сетке для оценки гиперпараметров

Настраиваемая стратегия повторного обучения поиска по сетке с перекрестной проверкой

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/model_selection/plot_successive_halving_iterations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API