По-прежнему эффективны в случаях, когда числовые измерения превышают число выборок.
Использует подмножество обучающих точек в функции принятия решений (называемых опорными векторами), что также эффективно с точками памяти и зрения.
Универсальность: для функций, принимающих решения, могут быть заданы различные функциональные ядра . Предоставляются общие ядра, но можно использовать и собственные.
К методам опорных векторов относятся:
Если число указывает на гораздо большее число выборок, то при выборе функциональных основ и терминов регулярности следует учитывать переобучение.
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- классы, Способные Выполнять бинарную и многоклассовую классификацию набора данных.
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]...)
SVCи NuSVCреализуют подход «один против одного» для многоклассовой классификации. Всего построено классификаторов, каждый из которых обучает данные двух классов.n_classes * (n_classes - 1) / 2
Для обеспечения согласования интерфейса с другими классификаторами опция decision_function_shapeпозволяет монотонно преобразовывать результаты классификаторов «один против одного» в функции принятия решений «один против всех» форм .(n_samples, n_classes)
С другой стороны, LinearSVCреализуется мультиклассовая смена «один против остальных» («один против остальных»), обучающая таким образом n_classesмодели.
Метод decision_functionи выдает оценку по классам для каждого образца (или один измеритель для образца в бинарном случае) SVC. NuSVC`Если дополнительный конструктор probabilityустановлен в True, оцените возможность включения оборудования в соответствии с классом (из методов predict_probaи predict_log_proba). В бинарном случае возможность калибруется с помощью шкалы Платта [ 9 ] : логистическая регрессия по увеличению SVM с дополнительной кросс-валидацией обучающих данных. В многоклассовом случае это изменение происходит в соответствии с [ 10 ] .
Кросс-валидация, задействованная в масштабировании платформы, является важной операцией для больших наборов данных.
Кроме того, вероятность оценки может не совпадать с величиной:
Оценки «argmax» могут не совпадать с вероятностями argmax.
при бинарной классификации образец может быть помечен predictкак признание к положительному классу, даже если результат predict_probaменьше 0,5; и точно так же он может быть помечен как отрицательный, даже если результат predict_probaбольше 0,5.
Известно, что метод Платта также имеет серьезные проблемы.
Если требуются доверительные оценки, но они не обязательно должны быть вероятностями, рекомендуется установить probability=Falseи использовать decision_functionвместо predict_proba.
Обратите внимание, что при decision_function_shape='ovr'и , в отличие от , метод по умолчанию не пытается разрушить связь. Вы можете установить , чтобы вывод был таким же, как и , иначе всегда будет первый класс среди классов классов; но имейте в виду, что это связано с вычислительными затратами. Пример развития на классы см. в Пример разрешения конфликтов SVM .n_classes > 2decision_functionpredictbreak_ties=Truepredictnp.argmax(clf.decision_function(...), axis=1)
1.4.1.3. Несбалансированные проблемы
В задачах, где необходимо придать большее значение классам или раздельным выборам, можно использовать параметры class_weightи sample_weight.
SVC(нет нет NuSVC) реализуется параметр class_weightв методе fit. Это словарь вида , где значение - число с плавающей точкой > 0, которое устанавливает параметр класса в . На рисунке ниже показана граница принятия решения несбалансированной задачи с коррекцией веса и без нее.{class_label : value}Cclass_labelC * value
SVC, NuSVC, SVR, NuSVR, LinearSVC, LinearSVRи OneClassSVMреализуют также вес для отдельных примеров в методе fitчерез параметр sample_weight. Как и class_weightон устанавливает параметры Cдля i-го примера , который следует за классификатором, правильно оценивает эти примеры. На рисунке ниже показано влияние взвешивания решений по принятию решений за границей. Размер кружков пропорционален весу выбора:C * sample_weight[i]
Метод классификации опорных векторов может быть расширен для решения задач регрессии. Этот метод называется регрессией опорных векторов.
Модель, полученная с помощью классификации опорных векторов (как указано выше), зависит только от подмножества обучающих данных, потому что функция затратна для построения модели не заботится об обучающих точках, которые исключают за пределы поля. Аналогично, модель, полученная с помощью регрессии опорных векторов, зависит только от подмножества обучающих данных, поскольку стоимость функции исключает бит, чье предсказание близко к целевому.
Существует три различных реализации опорных векторов регрессии: SVR, NuSVRи LinearSVR. LinearSVRобеспечивает более подходящее представление, чем SVR, но учитывает только линейные элементы, а NuSVRреализует немного другую формулировку, чем SVRи LinearSVR. Благодаря своей реализации liblinearLinearSVRтакже регулируется перехват, если он соблюдается.
Однако этот эффект можно уменьшить, тщательно настроив параметр 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])
Метод опорных векторов — мощные инструменты, но требования к вычислениям и хранению быстро определяются с учетом количества обучающих векторов. В основе SVM лежит задача квадратичного программирования (QP) , отделяющая опорные точки от остальных обучающих данных. Алгоритм QP, реализация на базе libsvm , масштабируется между
иВ зависимости от того, на данный момент эффективно используется кэш libsvm (зависит от набора данных). Если данные очень разрежены, то
Следует заменить среднее число ненулевыми признаками в векторных выборках.
Для линейного алгоритма случая, результат в LinearSVCреализации liblinear , гораздо эффективнее, чем его аналог SVCна базе libsvm , и может почти линейно масштабироваться до миллионов выборок и/или признаков.
1.4.5. Советы по практическому использованию
Избегание копирования данных : Для SVC, SVR, NuSVCи NuSVR, если данные, административные методы, не являются C-упорядоченными соответствующими и двойными точностью, они будут скопированы перед вызовом реализации C. Вы можете проверить, является ли данный массив numpy C-связным, просмотрев его атрибут flags.
Для LinearSVC(и LogisticRegression) любые входные данные, передаваемые в виде массива numpy, будут скопированы и преобразованы в технологии разреженного представления данных liblinear (с плавающей запятой, двойная точность и индексы int32, ненулевые компоненты). Если вы хотите запустить крупномасштабный линейный классификатор без копирования плотного массива 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)CCl1_min_c
1.4.6. Функциональные ядра
Функциональное начало может быть любым из следующих:
При обучении SVM с выбросами радиальной базисной функции (RBF) необходимо учитывать два параметра: Cи gamma. Параметр C, общий для всех ядер SVM, представляет собой компромисс между неправильной классификацией обучающих примеров и простой поверхностью принятия решений. Низкое значение Cимеет то, чтобы поверхность принимала решения плавно, в то время как высокие требования Cпозволяют правильно подготовить все обучающие уроки. gammaУстановлено, что сильно влияет на один обучающий пример. Чем больше gamma, тем ближе должны быть другие образцы, чтобы они соответствовали.
Правильный выбор Cимеет gammaрешающее значение для работы СВМ. Рекомендуется использовать GridSearchCVс Cи gamma, разнесенными на экспоненциальное расстояние, чтобы выбрать хорошие значения.
Вы можете определить свои собственные ядра, либо предоставив ядро в виде функции Python, либо предварительно вычислив матрицу Грама .
Классификаторы пользователей с нашими ядрами ведут себя так же, как и любые другие классификаторы, за исключением того, что:
Поле support_vectors_теперь пустое, support_`хранятся только индексы опорных векторов.
Ссылка (а не копия) первого аргумента метода fit()приводится для последующего использования. Если этот массив будет изменен между использованием fit()и predict(), вы получите неожиданные результаты.
Метод опорных векторов создает гиперплоскость или набор гиперплоскостей в пространстве высокой или бесконечной размерности, которые могут использоваться для классификации, регрессии или других задач. Интуитивно понятно, что хорошее разделение по гиперплоскости, которое имеет наибольшее расстояние до точки зрения обучающихся данных любого класса (так называемая функциональная маржа), поскольку в общем случае, чем больше маржа, тем меньше ошибка обобщения классификатора. На рисунке ниже показана функция принятия решений для линии разделяемой задачи с выбором ситуаций на границах границ, называемых «опорными векторами»:
В общем случае, когда задача не является разделяемой линией, опорные элементы — это доставка внутри границ поля.
Мы рекомендуем [ 13 ] и [ 14 ] в качестве хороших ссылок по теориям и практическим аспектам SVM.
1.4.7.1.СВК
Даны обучающие
, i=1,… , n, в двух классах и вектор, наша цель - найтиитакие, чтобы предсказание, существовало
это характерно для большинства представителей.
SVC решает эту первичную задачу:
Интуитивно мы пытаемся максимизировать маржу (минимизируя), получая при этом штраф, когда образец неправильно классифицирован или находится в пределах границы. В идеале значениедолжно быть равнодля всех образцов это означает идеальное предсказание. Но задача обычно не всегда идеально разделяет гиперплоскость, поэтому мы допускаем, что некоторые элементы могут располагаться на расстоянии.
от границ Логические поля. Штрафной член Cправления этой высшей меры наказания и, как это принято в Китае, применяет в качестве альтернативного параметра регулярности (см. примечание ниже).
Двойная задача для первой имеет вид
где- вектор всех единиц, а- положительная полубесконечная матрицак,, где- ядро.называются двойственными коэффициентами, и они ограничены сверху.
.
Это двойственное представление основано на том факте, что обучающиеся участвуют неявно в пространстве более (высокой возможности, бесконечной) величины ограничения.
После решения задачи оптимизация выход решение_функция для заданной выборки
получается:
предсказанный класс соответствует его знаку. Суммировать нужно только по опорным векторам (т.е. по выборам, голосованию в пределах полей), поскольку для остальных выборок двойные коэффициенты
равен нулю.
Доступ к этим параметрам можно получить через атрибуты dual_coef_, которые содержат произведение.
, support_vectors_, который содержит опорные элементы, и intercept_, который содержит независимый член
.
Примечание
В то время как SVM-модели, полученные из libsvm и liblinear , используются Cв качестве норм регулирования, большинство других оценочных средств используются alpha. Точная эквивалентность между средней регулировкой двух моделей зависит от точной функции, оптимизируемой модели. Например, если в качестве модели используется Ridgeрегрессия, то связь между ними задается как
.
1.4.7.2.СВР
Что касается обучающих аспектов
, i=1,…, n, и вектор
-СВР решает эту первичную задачу:
Здесь мы наказываем выборки, эти предсказания по крайней мере менееудалены от истинной цели. Эти создания представляют собой штрафную цель наили, в зависимости от того, оставили ли их предсказания выше или ниже трубки
.
Двойственная задача
где- вектор всех элементов,- положительная полубесконечная матрицана,- ядро. Здесь обучающие элементы неявно представлены в пространстве более высокой (возможно, бесконечной) размерности с помощью функции.
.
Предсказание:
Доступ к этим параметрам осуществляется через атрибуты dual_coef_, содержащие разность., support_vectors_, который содержит опорные элементы, и intercept_, который содержит независимый член
.
1.4.8. Детали реализации
Внутри мы используем libsvm [ 12 ] и liblinear [ 11 ] для обработки всех компьютеров. Эти библиотеки обернутся с помощью C и Cython.
Описание реализации и детали реализации алгоритмов приведены в соответствующих статьях.