Spec-Zone.ru › scikit-learn

1.4. Машины опорных векторов

Машины опорных векторов (SVM) — это набор методов обучения с учителем, используемых для классификации, регрессии и обнаружения выбросов.

Преимущества машин опорных векторов:

  • Эффективны в многомерных пространствах.
  • Остаются эффективными в случаях, когда количество измерений больше количества образцов.
  • Используют подмножество точек обучения в функции принятия решений (называемые опорными векторами), поэтому также экономичны по памяти.
  • Гибкие: для функции принятия решений можно задавать различные ядра. Предоставляются общие ядра, но также можно задавать пользовательские ядра.

Недостатки машин опорных векторов:

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

Машины опорных векторов в scikit-learn поддерживают как плотные (numpy.ndarray и преобразуемые к этому с помощью numpy.asarray), так и разреженные (любые scipy.sparse) векторы образцов в качестве входных данных. Однако для использования SVM для предсказания разреженных данных, оно должно было быть обучено на таких данных. Для оптимальной производительности используйте C-упорядоченные numpy.ndarray (плотные) или scipy.sparse.csr_matrix (разреженные) с dtype=float64.

1.4.1. Классификация

SVC, NuSVC и LinearSVC — это классы, способные выполнять бинарную и многоклассовую классификацию набора данных.

../_images/sphx_glr_plot_iris_svc_001.png

SVC и NuSVC — это похожие методы, но принимающие несколько другие наборы параметров и имеющие разные математические формулировки (см. раздел Математическая формулировка). С другой стороны, LinearSVC — это еще одна (более быстрая) реализация классификации опорных векторов для случая линейного ядра. Она также лишена некоторых атрибутов SVC и NuSVC, таких как support_. LinearSVC использует squared_hinge потерю и из-за своей реализации в liblinear также регуляризует свободный член, если он рассматривается. Однако этот эффект можно уменьшить, тщательно настраивая параметр intercept_scaling, что позволяет члену свободного члена иметь другое поведение регуляризации по сравнению с другими признаками. Результаты классификации и оценка, следовательно, могут отличаться от результатов других двух классификаторов.

Как и другие классификаторы, SVC, NuSVC и LinearSVC принимают в качестве входных данных два массива: массив X формы (n_samples, n_features), содержащий обучающие образцы, и массив y меток классов (строки или целые числа) формы (n_samples):

>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> clf = svm.SVC()
>>> clf.fit(X, y)
SVC()

После обучения модель может использоваться для предсказания новых значений:

>>> clf.predict([[2., 2.]])
array([1])

Функция принятия решений SVM (подробно описанная в Математической формулировке) зависит от некоторого подмножества обучающих данных, называемых опорными векторами. Некоторые свойства этих опорных векторов можно найти в атрибутах support_vectors_, support_ и n_support_:

>>> # get support vectors
>>> clf.support_vectors_
array([[0., 0.],
       [1., 1.]])
>>> # get indices of support vectors
>>> clf.support_
array([0, 1]...)
>>> # get number of support vectors for each class
>>> clf.n_support_
array([1, 1]...)

Примеры

  • SVM: Разделяющая гиперплоскость максимального отступа
  • SVM-Anova: SVM с отбором признаков по методу ANOVA
  • Построение вероятности классификации
END_OF_DOCUMENT_MARKER

1.4.1.1. Многоклассовая классификация

SVC и NuSVC реализуют подход «один против одного» для многоклассовой классификации. В общей сложности строится n_classes * (n_classes - 1) / 2 классификаторов, и каждый из них обучается на данных из двух классов. Для обеспечения согласованного интерфейса с другими классификаторами, опция decision_function_shape позволяет монотонно преобразовывать результаты классификаторов «один против одного» в функцию принятия решений «один против всех» формы (n_samples, n_classes), что является значением параметра по умолчанию (по умолчанию=’ovr’).

>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(decision_function_shape='ovo')
>>> clf.fit(X, Y)
SVC(decision_function_shape='ovo')
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 6 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4

С другой стороны, LinearSVC реализует многоклассовую стратегию «один против всех», тем самым обучая n_classes модели.

>>> lin_clf = svm.LinearSVC()
>>> lin_clf.fit(X, Y)
LinearSVC()
>>> dec = lin_clf.decision_function([[1]])
>>> dec.shape[1]
4

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

Подробности о многоклассовых стратегиях

Обратите внимание, что LinearSVC также реализует альтернативную многоклассовую стратегию, так называемую многоклассовую SVM, сформулированную Crammer и Singer [16], используя опцию multi_class='crammer_singer'. На практике классификация «один против всех» обычно предпочтительнее, так как результаты в основном похожи, но время выполнения значительно меньше.

Для «один против всех» LinearSVC атрибуты coef_ и intercept_ имеют форму (n_classes, n_features) и (n_classes,) соответственно. Каждая строка коэффициентов соответствует одному из n_classes классификаторов «один против всех», и аналогично для констант, в порядке класса «один».

В случае «один против одного» SVC и NuSVC структура атрибутов немного сложнее. В случае линейного ядра атрибуты coef_ и intercept_ имеют форму (n_classes * (n_classes - 1) / 2, n_features) и (n_classes * (n_classes - 1) / 2) соответственно. Это аналогично структуре для LinearSVC, описанной выше, при этом каждая строка теперь соответствует бинарному классификатору. Порядок для классов от 0 до n — «0 против 1», «0 против 2», … «0 против n», «1 против 2», «1 против 3», «1 против n», . . . «n-1 против n».

Форма dual_coef_ равна (n_classes-1, n_SV) со сложной структурой. Столбцы соответствуют опорным векторам, вовлечённым в любой из n_classes * (n_classes - 1) / 2 классификаторов «один против одного». Каждый опорный вектор v имеет коэффициент дуального решения в каждом из n_classes - 1 классификаторов, сравнивающих класс v с другим классом. Обратите внимание, что некоторые, но не все, из этих коэффициентов дуального решения могут быть равны нулю. Элементы n_classes - 1 в каждом столбце — эти коэффициенты дуального решения, упорядоченные по противоположному классу.

Это может быть понятнее на примере: рассмотрим задачу с тремя классами, где класс 0 имеет три опорных вектора \(v^{0}_0, v^{1}_0, v^{2}_0\), а классы 1 и 2 имеют по два опорных вектора \(v^{0}_1, v^{1}_1\) и \(v^{0}_2, v^{1}_2\) соответственно. Для каждого опорного вектора \(v^{j}_i\) существуют два коэффициента дуального решения. Назовем коэффициент опорного вектора \(v^{j}_i\) в классификаторе между классами \(i\) и \(k\) \(\alpha^{j}_{i,k}\). Тогда dual_coef_ выглядит так:

\(\alpha^{0}_{0,1}\)

\(\alpha^{1}_{0,1}\)

\(\alpha^{2}_{0,1}\)

\(\alpha^{0}_{1,0}\)

\(\alpha^{1}_{1,0}\)

\(\alpha^{0}_{2,0}\)

\(\alpha^{1}_{2,0}\)

\(\alpha^{0}_{0,2}\)

\(\alpha^{1}_{0,2}\)

\(\alpha^{2}_{0,2}\)

\(\alpha^{0}_{1,2}\)

\(\alpha^{1}_{1,2}\)

\(\alpha^{0}_{2,1}\)

\(\alpha^{1}_{2,1}\)

Коэффициенты для ОВ класса 0

Коэффициенты для ОВ класса 1

Коэффициенты для ОВ класса 2

Примеры

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

1.4.1.2. Оценки и вероятности

Метод decision_function для SVC и NuSVC возвращает оценки для каждого класса для каждого образца (или единственную оценку на образец в бинарном случае). Когда опция конструктора probability установлена в True, включены оценки вероятности принадлежности к классам (из методов predict_proba и predict_log_proba). В бинарном случае вероятности откалиброваны с помощью шкалирования Платта [9]: логистическая регрессия на оценках SVM, подгоняемая дополнительной перекрестной проверкой на обучающих данных. В многоклассовом случае это расширено в соответствии с [10].

Примечание

Такой же метод откалибровки вероятностей доступен для всех оценщиков с помощью CalibratedClassifierCV (см. Откалибровка вероятностей). В случае SVC и NuSVC, эта процедура реализована в libsvm, которая используется под капотом, поэтому она не зависит от CalibratedClassifierCV scikit-learn.

Перекрестная проверка, используемая в шкалировании Платта, является дорогостоящей операцией для больших наборов данных. Кроме того, оценки вероятностей могут быть несогласованными с оценками:

  • «argmax» оценок может не совпадать с argmax вероятностей
  • в бинарной классификации образец может быть отнесён predict к положительному классу, даже если значение predict_proba меньше 0,5; и аналогично, он может быть отнесён к отрицательному классу, даже если значение predict_proba больше 0,5.

Метод Платта также имеет теоретические проблемы. Если требуются оценки достоверности, но они не должны быть вероятностями, то целесообразно установить probability=False и использовать decision_function вместо predict_proba.

Обратите внимание, что при установке decision_function_shape='ovr' и n_classes > 2, в отличие от decision_function, метод predict по умолчанию не пытается разделить связи. Можно установить break_ties=True для того, чтобы вывод predict был таким же, как np.argmax(clf.decision_function(...), axis=1), в противном случае будет возвращаться первый класс из связанных классов; но имейте в виду, что это сопряжено с вычислительными затратами. Смотрите Пример разрыва связей в SVM для примера разрыва связей.

1.4.1.3. Несбалансированные задачи

В задачах, где требуется уделить большее значение определенным классам или отдельным образцам, можно использовать параметры class_weight и sample_weight.

SVC (но не NuSVC) реализует параметр class_weight в методе fit. Это словарь вида {class_label : value}, где значение — число с плавающей точкой > 0, которое устанавливает параметр C класса class_label в значение C * value. На рисунке ниже показана граница принятия решения для несбалансированной задачи с коррекцией весов и без неё.

../_images/sphx_glr_plot_separating_hyperplane_unbalanced_001.png

SVC, NuSVC, SVR, NuSVR, LinearSVC, LinearSVR и OneClassSVM также реализуют веса для отдельных образцов в методе fit через параметр sample_weight. Аналогично class_weight, это устанавливает параметр C для i-го примера в значение C * sample_weight[i], что стимулирует классификатор правильно распознавать эти образцы. На рисунке ниже показано влияние весов образцов на границу принятия решения. Размер кружков пропорционален весам образцов:

../_images/sphx_glr_plot_weighted_samples_001.png

Примеры

  • SVM: Разделяющая гиперплоскость для несбалансированных классов
  • SVM: Образцы с весами

1.4.2. Регрессия

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

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

Существует три различных реализации регрессии опорных векторов: SVR, NuSVR и LinearSVR. LinearSVR предоставляет более быструю реализацию, чем SVR, но учитывает только линейное ядро, в то время как NuSVR реализует несколько отличную формулу от SVR и LinearSVR. Благодаря своей реализации в liblinear LinearSVR также регламентирует сдвиг, если он рассматривается. Однако этот эффект можно уменьшить, тщательно настраивая параметр intercept_scaling, который позволяет сдвигу иметь другое поведение регуляризации по сравнению с другими признаками. Результаты классификации и оценка, следовательно, могут отличаться от результатов других двух классификаторов. Подробнее см. Подробные сведения об реализации.

Как и в классах для классификации, метод fit будет принимать в качестве аргументов векторы X, y, только что в этом случае y ожидается иметь значения с плавающей точкой вместо целых чисел:

>>> from sklearn import svm
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> regr = svm.SVR()
>>> regr.fit(X, y)
SVR()
>>> regr.predict([[1, 1]])
array([1.5])

Примеры

  • Регрессия опорных векторов (SVR) с линейными и нелинейными ядрами

1.4.3. Оценивание плотности, обнаружение новизны

Класс OneClassSVM реализует SVM одного класса, используемый для обнаружения выбросов.

См. Обнаружение новизны и выбросов для описания и использования OneClassSVM.

1.4.4. Сложность

Машины опорных векторов — мощные инструменты, но их вычислительные и требования к памяти быстро возрастают с увеличением числа обучающих векторов. Ядро SVM — это задача квадратичного программирования (QP), разделяющая опорные векторы от остальных обучающих данных. QP-решатель, используемый реализацией на основе libsvm, масштабируется от \(O(n_{features} \times n_{samples}^2)\) до \(O(n_{features} \times n_{samples}^3)\) в зависимости от эффективности использования кеша libsvm на практике (зависит от набора данных). Если данные очень разреженные, \(n_{features}\) следует заменить на среднее число ненулевых признаков в векторе образца.

В линейном случае алгоритм, используемый в LinearSVC с помощью реализации liblinear, намного эффективнее, чем его аналог на основе libsvm SVC и может масштабироваться почти линейно до миллионов образцов и/или признаков.

1.4.5. Советы по практическому применению

  • Избегание копирования данных: Для SVC, SVR, NuSVC и NuSVR, если данные, переданные в определённые методы, не являются непрерывными в порядке C и двойной точности, они будут скопированы перед вызовом базовой C-реализации. Вы можете проверить, является ли заданный массив NumPy непрерывным в порядке C, просмотрев его атрибут flags.

    Для LinearSVC (и LogisticRegression) любой ввод, переданный в виде массива NumPy, будет скопирован и преобразован в внутреннее разреженное представление данных liblinear (числа с плавающей запятой двойной точности и целочисленные индексы 32-битного типа для ненулевых компонент). Если вы хотите обучить линейный классификатор большой размерности без копирования плотного массива NumPy с непрерывными данными двойной точности в порядке C как вход, мы рекомендуем использовать класс SGDClassifier вместо этого. Функция цели может быть настроена практически так же, как и для модели LinearSVC.

  • Размер кэша ядра: Для SVC, SVR, NuSVC и NuSVR размер кэша ядра оказывает значительное влияние на время выполнения для более сложных задач. Если у вас достаточно оперативной памяти, рекомендуется установить cache_size на более высокое значение, чем значение по умолчанию 200 (МБ), например, 500 (МБ) или 1000 (МБ).
  • Настройка C: C по умолчанию имеет значение 1, и это разумный выбор по умолчанию. Если у вас много шумных наблюдений, уменьшите его: уменьшение C соответствует большей регуляризации.

    LinearSVC и LinearSVR менее чувствительны к C при увеличении значения, и результаты предсказания перестают улучшаться после определённого порога. Одновременно, более большие значения C потребуют больше времени на обучение, иногда до 10 раз больше, как показано в [11].

  • Алгоритмы опорных векторных машин не инвариантны к масштабированию, поэтому настоятельно рекомендуется масштабировать ваши данные. Например, масштабируйте каждый атрибут входного вектора X в диапазон [0,1] или [-1,+1], или стандартизируйте его, чтобы среднее значение было равно 0, а дисперсия — 1. Обратите внимание, что одинаковое масштабирование необходимо применить к тестовому вектору, чтобы получить осмысленные результаты. Это можно легко сделать, используя Pipeline:

    >>> from sklearn.pipeline import make_pipeline
    >>> from sklearn.preprocessing import StandardScaler
    >>> from sklearn.svm import SVC
    
    >>> clf = make_pipeline(StandardScaler(), SVC())
    

    Подробнее о масштабировании и нормализации см. раздел Обработка данных.

  • Что касается параметра shrinking, цитируя [12]: Мы обнаружили, что если количество итераций велико, то сжатие может сократить время обучения. Однако, если мы нестрого решаем задачу оптимизации (например, используя большой параметр толерантности остановки), код без использования сжатия может быть значительно быстрее
  • Параметр nu в NuSVC/OneClassSVM/NuSVR приближает долю ошибок обучения и опорных векторов.
  • В SVC, если данные несбалансированы (например, много положительных и мало отрицательных), установите class_weight='balanced' и/или попробуйте различные параметры штрафа C.
  • Случайность базовых реализаций: Базовые реализации SVC и NuSVC используют генератор случайных чисел только для перемешивания данных для оценки вероятности (когда probability установлено в True). Эта случайность может быть контролирована параметром random_state. Если probability установлено в False, эти оценки не случайны и random_state не влияет на результаты. Базовая реализация OneClassSVM аналогична реализациям SVC и NuSVC. Поскольку для OneClassSVM не предоставляется оценка вероятности, она не случайная.

    Базовая реализация LinearSVC использует генератор случайных чисел для выбора признаков при обучении модели с помощью двойного спуска по координатам (т.е. когда dual установлено в True). Поэтому нередко результаты для одних и тех же входных данных могут немного отличаться. Если это происходит, попробуйте уменьшить параметр tol. Эта случайность также может быть контролируема параметром random_state. Когда dual установлено в False, базовая реализация LinearSVC не случайная, и random_state не оказывает влияния на результаты.

  • Использование L1-регуляризации, предоставляемой LinearSVC(penalty='l1', dual=False), приводит к разреженной (sparse) оценке, т. е. только подмножество весов признаков отличается от нуля и вносит вклад в функцию принятия решения. Увеличение C приводит к более сложной модели (выбирается больше признаков). Значение C, которое приводит к «нулевой» модели (все веса равны нулю), может быть вычислено с помощью l1_min_c.

1.4.6. Функции ядра

Функция ядра может быть любой из следующих:

  • линейная: \(\langle x, x'\rangle\).
  • полиномиальная: \((\gamma \langle x, x'\rangle + r)^d\), где \(d\) задаётся параметром degree, \(r\) — параметром coef0.
  • RBF: \(\exp(-\gamma \|x-x'\|^2)\), где \(\gamma\) задаётся параметром gamma, должно быть больше 0.
  • сигмоидальная: \(\tanh(\gamma \langle x,x'\rangle + r)\), где \(r\) задаётся параметром coef0.

Разные ядра задаются параметром kernel:

>>> linear_svc = svm.SVC(kernel='linear')
>>> linear_svc.kernel
'linear'
>>> rbf_svc = svm.SVC(kernel='rbf')
>>> rbf_svc.kernel
'rbf'

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

1.4.6.1. Параметры ядра RBF

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

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

Примеры

  • Параметры RBF SVM
  • Масштабирование параметра регуляризации для SVC

1.4.6.2. Пользовательские ядра

Вы можете определить свои собственные ядра, либо передав ядро в виде функции Python, либо предварительно вычислив матрицу Грама.

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

  • Поле support_vectors_ теперь пусто, в support_ хранятся только индексы опорных векторов.
  • Ссылка (а не копия) первого аргумента в методе fit() сохраняется для дальнейшего использования. Если этот массив изменится между использованием fit() и predict(), вы получите неожиданные результаты.
Использование функций Python в качестве ядер

Вы можете использовать свои собственные ядра, передав функцию в параметр kernel.

Ваше ядро должно принимать в качестве аргументов две матрицы размером (n_samples_1, n_features), (n_samples_2, n_features) и возвращать матрицу ядра размером (n_samples_1, n_samples_2).

Следующий код определяет линейное ядро и создаёт экземпляр классификатора, который будет использовать это ядро:

>>> import numpy as np
>>> from sklearn import svm
>>> def my_kernel(X, Y):
...     return np.dot(X, Y.T)
...
>>> clf = svm.SVC(kernel=my_kernel)
Использование матрицы Грама

Вы можете передать предварительно вычисленные ядра, используя опцию kernel='precomputed'. Затем вы должны передать матрицу Грама вместо X в методы fit и predict. Необходимо предоставить значения ядра между всеми обучающими векторами и тестовыми векторами:

>>> import numpy as np
>>> from sklearn.datasets import make_classification
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import svm
>>> X, y = make_classification(n_samples=10, random_state=0)
>>> X_train , X_test , y_train, y_test = train_test_split(X, y, random_state=0)
>>> clf = svm.SVC(kernel='precomputed')
>>> # linear kernel computation
>>> gram_train = np.dot(X_train, X_train.T)
>>> clf.fit(gram_train, y_train)
SVC(kernel='precomputed')
>>> # predict on training examples
>>> gram_test = np.dot(X_test, X_train.T)
>>> clf.predict(gram_test)
array([0, 1, 0])

Примеры

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

1.4.7. Математическая формулировка

Машина опорных векторов (Support Vector Machine, SVM) строит гиперплоскость или набор гиперплоскостей в пространстве высокой или бесконечной размерности, которые могут использоваться для классификации, регрессии или других задач. Интуитивно, хорошее разделение достигается гиперплоскостью, имеющей наибольшее расстояние до ближайших обучающих точек любого класса (так называемый функциональный отступ), так как, в общем случае, чем больше отступ, тем ниже обобщающая ошибка классификатора. На рисунке ниже показана функция принятия решения для линейно разделимой задачи, с тремя образцами на границах отступа, называемыми «опорными векторами»:

../_images/sphx_glr_plot_separating_hyperplane_001.png

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

Мы рекомендуем [13] и [14] в качестве хороших ссылок по теории и практическому применению SVM.

1.4.7.1. SVC

Даны обучающие векторы \(x_i \in \mathbb{R}^p\), i=1,…, n, в двух классах, и вектор \(y \in \{1, -1\}^n\), наша цель — найти \(w \in \mathbb{R}^p\) и \(b \in \mathbb{R}\) такие, что прогноз, задаваемый \(\text{sign} (w^T\phi(x) + b)\), верен для большинства образцов.

SVC решает следующую исходную задачу:

\[ \begin{align}\begin{aligned}\min_ {w, b, \zeta} \frac{1}{2} w^T w + C \sum_{i=1}^{n} \zeta_i\\\begin{split}\textrm {при условии } & y_i (w^T \phi (x_i) + b) \geq 1 - \zeta_i,\\ & \zeta_i \geq 0, i=1, ..., n\end{split}\end{aligned}\end{align} \]

Интуитивно, мы пытаемся максимизировать отступ (минимизируя \(||w||^2 = w^Tw\)), одновременно внося штраф, когда образец ошибочно классифицирован или находится внутри границы отступа. В идеале, значение \(y_i (w^T \phi (x_i) + b)\) должно быть \(\geq 1\) для всех образцов, что указывает на правильный прогноз. Но проблемы обычно не всегда идеально разделяются гиперплоскостью, поэтому мы допускаем, что некоторые образцы находятся на расстоянии \(\zeta_i\) от их правильной границы отступа. Слагаемое штрафа C управляет силой этого штрафа и, как следствие, выступает в качестве обратного параметра регуляризации (см. примечание ниже).

Сопряжённая задача исходной задачи:

\[ \begin{align}\begin{aligned}\min_{\alpha} \frac{1}{2} \alpha^T Q \alpha - e^T \alpha\\\begin{split} \textrm {при условии } & y^T \alpha = 0\\ & 0 \leq \alpha_i \leq C, i=1, ..., n\end{split}\end{aligned}\end{align} \]

где \(e\) — вектор всех единиц, а \(Q\) — положительно полуопределённая матрица размером \(n\) на \(n\), \(Q_{ij} \equiv y_i y_j K(x_i, x_j)\), где \(K(x_i, x_j) = \phi (x_i)^T \phi (x_j)\) — ядро. Члены \(\alpha_i\) называются двойственными коэффициентами, и они ограничены сверху значением \(C\). Это двойственное представление подчеркивает тот факт, что обучающие векторы неявно отображаются в пространство большей (возможно, бесконечной) размерности функцией \(\phi\): см. трюк с ядром.

После решения задачи оптимизации, результат вызова decision_function для заданного образца \(x\) становится:

\[\sum_{i\in SV} y_i \alpha_i K(x_i, x) + b,\]

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

Эти параметры можно получить через атрибуты dual_coef_, который содержит произведение \(y_i \alpha_i\), support_vectors_, который содержит опорные векторы, и intercept_, который содержит свободный член \(b\)

Примечание

В то время как модели SVM, полученные из libsvm и liblinear используют C в качестве параметра регуляризации, большинство других оценок используют alpha. Точное соответствие между степенью регуляризации двух моделей зависит от точного целевого функционала, оптимизируемого моделью. Например, когда используемая оценка — регрессия Ridge, связь между ними задаётся как \(C = \frac{1}{alpha}\).

LinearSVC

Исходная задача может быть эквивалентно сформулирована как

\[\min_ {w, b} \frac{1}{2} w^T w + C \sum_{i=1}^{n}\max(0, 1 - y_i (w^T \phi(x_i) + b)),\]

где мы используем функцию потерь с отступом. Это форма, которая непосредственно оптимизируется LinearSVC, но, в отличие от двойственной формы, эта форма не включает внутренние произведения между образцами, поэтому знаменитый трюк с ядром не может быть применён. Именно поэтому LinearSVC поддерживает только линейное ядро (\(\phi\) — тождественная функция).

NuSVC

Формулировка \(\nu\)-SVC [15] является перепараметризацией \(C\)-SVC и, следовательно, математически эквивалентна.

Мы вводим новый параметр \(\nu\) (вместо \(C\)), который управляет количеством опорных векторов и ошибками отступа: \(\nu \in (0, 1]\) является верхней границей доли ошибок отступа и нижней границей доли опорных векторов. Ошибка отступа соответствует образцу, который лежит не на правильной стороне границы отступа: он либо неправильно классифицирован, либо правильно классифицирован, но не лежит за границей отступа.

1.4.7.2. SVR

Даны тренировочные векторы \(x_i \in \mathbb{R}^p\), i=1,…, n, и вектор \(y \in \mathbb{R}^n\) \(\varepsilon\)-SVR решает следующую первоначальную задачу:

\[ \begin{align}\begin{aligned}\min_ {w, b, \zeta, \zeta^*} \frac{1}{2} w^T w + C \sum_{i=1}^{n} (\zeta_i + \zeta_i^*)\\\begin{split}\textrm {subject to } & y_i - w^T \phi (x_i) - b \leq \varepsilon + \zeta_i,\\ & w^T \phi (x_i) + b - y_i \leq \varepsilon + \zeta_i^*,\\ & \zeta_i, \zeta_i^* \geq 0, i=1, ..., n\end{split}\end{aligned}\end{align} \]

Здесь мы штрафуем примеры, предсказание которых отличается от истинного значения по крайней мере на \(\varepsilon\). Эти примеры штрафуют целевую функцию на \(\zeta_i\) или \(\zeta_i^*\), в зависимости от того, находится ли их предсказание выше или ниже \(\varepsilon\)-трубы.

Сопряжённая задача имеет вид

\[ \begin{align}\begin{aligned}\min_{\alpha, \alpha^*} \frac{1}{2} (\alpha - \alpha^*)^T Q (\alpha - \alpha^*) + \varepsilon e^T (\alpha + \alpha^*) - y^T (\alpha - \alpha^*)\\\begin{split} \textrm {subject to } & e^T (\alpha - \alpha^*) = 0\\ & 0 \leq \alpha_i, \alpha_i^* \leq C, i=1, ..., n\end{split}\end{aligned}\end{align} \]

где \(e\) — вектор всех единиц, \(Q\) — положительно полуопределённая матрица размера \(n\) на \(n\), \(Q_{ij} \equiv K(x_i, x_j) = \phi (x_i)^T \phi (x_j)\) — ядро. Здесь тренировочные векторы неявно отображаются в пространство большей (возможно, бесконечной) размерности с помощью функции \(\phi\).

Предсказание имеет вид:

\[\sum_{i \in SV}(\alpha_i - \alpha_i^*) K(x_i, x) + b\]

Эти параметры могут быть получены через атрибуты dual_coef_, который содержит разность \(\alpha_i - \alpha_i^*\), support_vectors_, который содержит опорные векторы, и intercept_, который содержит свободный член \(b\)

LinearSVR

Первоначальная задача может быть эквивалентно сформулирована как

\[\min_ {w, b} \frac{1}{2} w^T w + C \sum_{i=1}^{n}\max(0, |y_i - (w^T \phi(x_i) + b)| - \varepsilon),\]

где мы используем \(\varepsilon\)-нечувствительную функцию потерь, т.е. ошибки, меньшие чем \(\varepsilon\), игнорируются. Это форма, которая напрямую оптимизируется с помощью LinearSVR.

1.4.8. Детали реализации

Внутренне мы используем libsvm [12] и liblinear [11] для обработки всех вычислений. Эти библиотеки оборачиваются с помощью C и Cython. Для описания реализации и деталей используемых алгоритмов, пожалуйста, обратитесь к соответствующим статьям.

Ссылки

[9]

Platt “Вероятностные выходные данные для SVM и сравнение с методами регуляризованной вероятности”.

[10]

Wu, Lin и Weng, “Вероятностные оценки для многоклассовой классификации с помощью парного сопряжения”, JMLR 5:975-1005, 2004.

[11] (1,2)

Fan, Rong-En и др., “LIBLINEAR: Библиотека для крупномасштабной линейной классификации.”, Журнал машинного обучения 9.Август (2008): 1871-1874.

[12] (1,2)

Chang и Lin, LIBSVM: Библиотека для машин опорных векторов.

[13]

Bishop, Распознавание образов и машинное обучение, глава 7 Машины с разреженными ядрами

[14]

“Обзор регрессии с помощью опорных векторов” Алекс Дж. Смола, Бернхард Шёлькёпф - Архив «Статистики и вычислений» Том 14 Выпуск 3, август 2004 г., с. 199-222.

[15]

Шёлькёпф и др. Новые алгоритмы SVM

[16]

Краммер и Сингер О реализации алгоритмов многоклассовых машин опорных векторов с ядром, JMLR 2001.

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

Spec-Zone.ru

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