Вы подписаны на Машинное обучение доступно
Отлично! завершите оплату для полного доступа к Машинное обучение доступно
Снова приветствуем Вас! Вы успешно авторизовались
Успех! Аккаунт активирован, и Вы имеете полный доступ к контенту.
Параметр регуляризации C (C Regularizaton Parameter)

Параметр регуляризации C (C Regularizaton Parameter)

in

C (параметр регуляризации) – мера степени наказания Модель (Model) за каждую неверно классифицированную точку.

Метод опорных векторов – это такая разновидность Алгоритма (Algorithm) Классификации (Classification), которая пытается найти плоскости, отделяющие положительные точки от отрицательных:

Сплошная линия посередине представляет собой наилучшую возможную линию разделения положительных Наблюдений (Observation) от отрицательных. Точки в кружке – это Опорные векторы (Support Vector).

SVM также может находить разделительные кривые:

Ядра – функции преобразования могут так трансформировать набор точек, что разделяющая гиперплоскость будет найдена.

Шум

Реальные данные содержат так называемый шум, так что надежный классификатор SVM должен уметь игнорировать "зашумленные" Выбросы (Outlier), чтобы обнаружить обобщаемую плоскость:

Соответственно, выделяют две разновидности зазоров (разделительных полей вдоль гиперплоскости) – жесткие и мягкие. Первые находят лучшую гиперплоскость, отделяющую положительные точки от отрицательных, так что ни один элемент не классифицируется неправильно. Второй же допускает неверную классификацию таких отстоящих наблюдений, и в этом случае разделяющая функция подвергается так называемому Наказанию (Penalizing) пропорционально степени ошибочной классификации. По умолчанию в большинстве библиотек реализованы мягкие зазоры.

Теперь понять значение гиперпараметра C будет легко: он контролирует, насколько мы хотим наказать модель за каждую неверно классифицированную точку. Большое значение C приводит к тому, что из всех возможных гиперплоскостей будет иметь приоритет тот, что совершил наименьшее количество классификационных ошибок. Низкое значение C, наоборот, выберет такую разделительную границу, что хорошо разделяет точки, допуская некоторую погрешность.

Параметр регуляризации C и Scikit-learn

Посмотрим, как влияет C на согласованность прогнозов. Для начала импортируем необходимые библиотеки:

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

import sklearn as sk
from sklearn.svm import LinearSVC
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import GridSearchCV
from sklearn.utils import check_random_state
from sklearn import datasets

Сгенерируем датасет из 100 случайных наблюдений с 300 признаками у каждого:

rnd = check_random_state(1)
n_samples = 100
n_features = 300

В SkLearn принято выделять два вида значений C: l1 и l2.  Первая теория утверждает, что согласованность прогнозов невозможна из-за смещения l1. Однако согласованность модели с точки зрения нахождения правильного набора ненулевых параметров, а также их знаков, может быть достигнута путем Нормализации (Normalization) C.

# l1: только пять признаков считаются информативными
X_1, y_1 = datasets.make_classification(n_samples = n_samples,
                                        n_features = n_features, n_informative = 5,
                                        random_state = 1)

# l2: данные не разрежены, но признаков меньше
y_2 = np.sign(.5 - rnd.rand(n_samples))
X_2 = rnd.randn(n_samples, n_features // 5) + y_2[:, np.newaxis]
X_2 += 5 * rnd.randn(n_samples, n_features // 5)

Инициируем два алгоритма LinearSVC c двумя типами наказаний. Для классифицирующих моделей, особенно для метода опорных векторов, используют свой вид потерь – Потери Шарнира (Hinge Loss). Параметризуем цвета кривых обучения:

clf_sets = [(LinearSVC(penalty = 'l1', loss = 'squared_hinge', dual = False, tol = 1e - 3),
             np.logspace(-2.3, -1.3, 10), X_1, y_1),
            (LinearSVC(penalty = 'l2', loss = 'squared_hinge', dual = True),
             np.logspace(-4.5, -2, 10), X_2, y_2)]

colors = ['navy', 'cyan', 'darkorange']
lw = 2

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

for clf, cs, X, y in clf_sets:
    # Настроим график для каждой функции регрессии
    fig, axes = plt.subplots(nrows = 2, sharey = True, figsize = (9, 10))

    for k, train_size in enumerate(np.linspace(0.3, 0.7, 3)[::-1]):
        param_grid = dict(C = cs)
        # Чтобы получить "хорошую" кривую, нам нужно большое число
        # итераций и низкая Дисперсия случайной величины
        grid = GridSearchCV(clf, refit = False, param_grid = param_grid,
                            cv=ShuffleSplit(train_size = train_size,
                                            test_size = .3,
                                            n_splits = 250, random_state = 1))
        grid.fit(X, y)
        scores = grid.cv_results_['mean_test_score']

        scales = [(1, 'No scaling'),
                  ((n_samples * train_size), '1/n_samples'),
                  ]

        for ax, (scaler, name) in zip(axes, scales):
            ax.set_xlabel('C')
            ax.set_ylabel('CV Score')
            grid_cs = cs * float(scaler)  # scale the C's
            ax.semilogx(grid_cs, scores, label = "fraction %.2f" %
                        train_size, color = colors[k], lw = lw)
            ax.set_title('scaling = %s, penalty = %s, loss = %s' %
                         (name, clf.penalty, clf.loss))

    plt.legend(loc = "best")
plt.show()

На двух рисунках ниже показаны значения C на оси x и соответствующие баллы Кросс-валидации (Cross Validation) на оси y для нескольких различных частей сгенерированного набора данных:

В первом случае нет масштабирования, во втором – 1 / n_samples

Теория гласит, что для достижения согласованности прогнозирования параметр штрафа l2 должен оставаться постоянным по мере роста количества выборок:

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @sabeerdarr

Автор оригинальной статьи: Felipe