Spec-Zone.ru › scikit-learn

Примечание

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

Параметры SVM с ядром RBF

В этом примере показано влияние параметров gamma и C на SVM с ядром радиальной базисной функции (RBF).

Интуитивно параметр gamma определяет, насколько далеко распространяется влияние одного обучающего примера: малые значения соответствуют большому расстоянию, а большие — малому. Параметры gamma можно рассматривать как обратную величину радиуса влияния образцов, выбранных моделью в качестве опорных векторов.

Параметр C задаёт компромисс между правильной классификацией обучающих примеров и максимизацией зазора разделяющей функции. При больших значениях C допускается меньший зазор, если разделяющая функция точнее классифицирует все обучающие точки. Меньшее значение C способствует увеличению зазора и, следовательно, упрощению разделяющей функции, но снижает точность на обучающей выборке. Иными словами, C выступает в роли параметра регуляризации в SVM.

На первом графике показана визуализация разделяющей функции для разных значений параметров в упрощённой задаче классификации, где используются только 2 входных признака и 2 возможных целевых класса (бинарная классификация). Обратите внимание, что такой график невозможно построить для задач с большим количеством признаков.

На втором графике показана тепловая карта точности классификатора при перекрёстной проверке в зависимости от C и gamma. Для наглядности в этом примере мы исследуем сравнительно большую сетку. На практике обычно достаточно логарифмической сетки от \(10^{-3}\) до \(10^3\). Если лучшие параметры находятся на границах сетки, при следующем поиске её можно расширить в соответствующем направлении.

Обратите внимание, что для графика тепловой карты используется специальная цветовая шкала со средним значением, близким к оценкам лучших моделей. Это позволяет мгновенно различать их.

Поведение модели очень чувствительно к параметру gamma. Если gamma слишком велико, радиус области влияния опорных векторов охватывает только сам опорный вектор, и никакая регуляризация с помощью C не сможет предотвратить переобучение.

Если gamma очень мало, модель слишком ограничена и не может уловить сложность или «форму» данных. Область влияния любого выбранного опорного вектора будет охватывать всю обучающую выборку. Полученная модель будет вести себя подобно линейной модели с набором гиперплоскостей, разделяющих центры областей высокой плотности любых двух классов.

Для промежуточных значений на втором графике видно, что хорошие модели можно найти на диагонали значений C и gamma. Плавные модели (с меньшими значениями gamma) можно сделать более сложными, увеличив важность правильной классификации каждой точки (большие значения C). Этим объясняется диагональное расположение моделей с хорошими результатами.

Наконец, можно заметить, что для некоторых промежуточных значений gamma мы получаем модели с одинаковыми результатами, когда C становится очень большим. Это говорит о том, что набор опорных векторов больше не меняется. Один лишь радиус ядра RBF служит хорошим структурным регуляризатором. Дальнейшее увеличение C не помогает, вероятно, потому что больше нет обучающих точек, нарушающих условия (лежащих внутри зазора или классифицированных неверно), либо потому что найти более удачное решение невозможно. Если оценки одинаковы, имеет смысл использовать меньшие значения C, поскольку очень большие значения C обычно увеличивают время обучения.

С другой стороны, меньшие значения C обычно приводят к увеличению числа опорных векторов, что может увеличить время предсказания. Поэтому уменьшение значения C предполагает компромисс между временем обучения и временем предсказания.

Также следует отметить, что небольшие различия в оценках возникают из-за случайного разбиения данных при перекрёстной проверке. Эти случайные колебания можно сгладить, увеличив количество итераций перекрёстной проверки n_splits, но это потребует больше вычислительного времени. Увеличение количества шагов C_range и gamma_range повысит разрешение тепловой карты гиперпараметров.

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

Вспомогательный класс для перемещения средней точки цветовой карты к интересующим значениям.

import numpy as np
from matplotlib.colors import Normalize


class MidpointNormalize(Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
        return np.ma.masked_array(np.interp(value, x, y))

Загрузка и подготовка набора данных

Набор данных для поиска по сетке

from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target

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

X_2d = X[:, :2]
X_2d = X_2d[y > 0]
y_2d = y[y > 0]
y_2d -= 1

Перед обучением SVM обычно рекомендуется масштабировать данные. В этом примере мы немного упрощаем задачу: масштабируем все данные, а не обучаем преобразование на обучающей выборке и применяем его только к тестовой.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X = scaler.fit_transform(X)
X_2d = scaler.fit_transform(X_2d)

Обучение классификаторов

Для первоначального поиска часто полезна логарифмическая сетка с основанием 10. Основание 2 позволяет выполнить более точную настройку, но требует значительно больше ресурсов.

from sklearn.model_selection import GridSearchCV, StratifiedShuffleSplit
from sklearn.svm import SVC

C_range = np.logspace(-2, 10, 13)
gamma_range = np.logspace(-9, 3, 13)
param_grid = dict(gamma=gamma_range, C=C_range)
cv = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42)
grid = GridSearchCV(SVC(), param_grid=param_grid, cv=cv)
grid.fit(X, y)

print(
    f"The best parameters are {grid.best_params_} "
    f"with a score of {grid.best_score_:0.2f}"
)
The best parameters are {'C': np.float64(1.0), 'gamma': np.float64(0.1)} with a score of 0.97

Теперь нужно обучить классификатор для всех параметров в двумерной версии (здесь мы используем меньший набор параметров, поскольку обучение занимает некоторое время).

C_2d_range = [0.01, 1, 100]
gamma_2d_range = [0.1, 1, 10]
classifiers = []
for C in C_2d_range:
    for gamma in gamma_2d_range:
        clf = SVC(C=C, gamma=gamma)
        clf.fit(X_2d, y_2d)
        classifiers.append((C, gamma, clf))

Визуализация

Построим границы разделения для разных значений gamma и C.

import matplotlib.pyplot as plt

from sklearn.inspection import DecisionBoundaryDisplay

plt.figure(figsize=(8, 6))
for k, (C, gamma, clf) in enumerate(classifiers):
    plt.subplot(len(C_2d_range), len(gamma_2d_range), k + 1)
    plt.title(f"gamma={gamma}, C={C}", size="medium")
    # visualize decision boundary for these parameters
    DecisionBoundaryDisplay.from_estimator(
        clf,
        X_2d,
        eps=0.5,
        cmap="RdBu_r",
        ax=plt.gca(),
        response_method="decision_function",
        plot_method="pcolormesh",
    )
    # also plot the data
    plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y_2d, cmap=plt.cm.RdBu_r, edgecolors="k")
    plt.xticks(())
    plt.yticks(())
gamma=0.1, C=0.01, gamma=1, C=0.01, gamma=10, C=0.01, gamma=0.1, C=1, gamma=1, C=1, gamma=10, C=1, gamma=0.1, C=100, gamma=1, C=100, gamma=10, C=100

Построим тепловую карту точности на проверочной выборке в зависимости от gamma и C

Оценки представлены цветами палитры hot, переходящей от тёмно-красного к ярко-жёлтому. Поскольку наиболее интересные оценки находятся в диапазоне от 0.92 до 0.97, мы используем специальный нормализатор, задающий среднюю точку равной 0.92. Так небольшие различия оценок в интересующем диапазоне легче визуализировать, и при этом все низкие оценки не сводятся резко к одному цвету.

scores = grid.cv_results_["mean_test_score"].reshape(len(C_range), len(gamma_range))
plt.figure(figsize=(8, 6))
plt.subplots_adjust(left=0.2, right=0.95, bottom=0.15, top=0.95)
plt.imshow(
    scores,
    interpolation="nearest",
    cmap=plt.cm.hot,
    norm=MidpointNormalize(vmin=0.2, midpoint=0.92),
)
plt.xlabel("gamma")
plt.ylabel("C")
plt.colorbar()
plt.xticks(np.arange(len(gamma_range)), gamma_range, rotation=45)
plt.yticks(np.arange(len(C_range)), C_range)
plt.title("Validation accuracy")
plt.show()
Validation accuracy

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_rbf_parameters.ipynb

Download Python source code: plot_rbf_parameters.py

Download zipped: plot_rbf_parameters.zip

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

Построение границ классификации с разными ядрами SVM

Построение разных классификаторов SVM на наборе данных iris

SVM с пользовательским ядром

Явная аппроксимация отображения признаков для ядер RBF

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/svm/plot_rbf_parameters.html

Spec-Zone.ru

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