Я недавно начал учиться работать с sklearn
и только что столкнулся с этим странным результатом.
Я использовал digits
доступный набор данных, sklearn
чтобы попробовать разные модели и методы оценки.
Когда я тестировал модель машины опорных векторов на данных, я обнаружил, что есть два разных класса sklearn
для классификации SVM: SVC
и LinearSVC
, где первый использует подход « один против одного», а другой - подход « один против остальных» .
Я не знал, как это повлияет на результаты, поэтому попробовал оба варианта. Я проводил оценку в стиле Монте-Карло, где я выполнял обе модели по 500 раз, каждый раз разбивая выборку случайным образом на 60% обучения и 40% теста и вычисляя ошибку прогноза на тестовом наборе.
Обычная оценка SVC выдает следующую гистограмму ошибок: в то время как оценка линейного SVC выдает следующую гистограмму:
Что может объяснить такую резкую разницу? Почему линейная модель большую часть времени обладает такой высокой точностью?
И, соответственно, что может быть причиной резкой поляризации результатов? Либо с точностью, близкой к 1, либо с точностью, близкой к 0, между ними ничего нет.
Для сравнения, классификация дерева решений выявила гораздо более нормально распределенный коэффициент ошибок с точностью около 0,85.
источник
Similar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better (to large numbers of samples).
Ответы:
Обычный SVM со значениями по умолчанию использует радиальную базисную функцию в качестве ядра SVM. Это в основном ядро Гаусса, известное как кривая колокола. Это означает, что ничья земля между различными классами создается с помощью гауссовой функции. Линейный SVM использует линейное ядро для базисной функции, поэтому вы можете думать об этом как о функции в форме ^. Это гораздо менее настраиваемый и в основном просто линейная интерполяция.
Люди вроде как задают этот вопрос, потому что вы не предоставили много информации, но внимательно изучаете то, что вы опубликовали ... это затрагивает некоторые фундаментальные аспекты реального понимания деталей смещения и дисперсии, а также различия между линейным и нелинейным Базисные функции в SVM.
Проверьте это изображение, описывающее четыре области высокого и низкого смещения и высокого и низкого отклонения. Очевидно, что лучшее место для этого - низкая дисперсия и низкий уклон.
Сначала давайте оценим дисперсию -
Теперь взгляните на свои участки:
Нелинейная базисная функция имеет большую дисперсию. Посмотрите, как оно шумнее, чем линейное ядро! Линейное ядро имеет меньшую дисперсию. Посмотрите, как это менее шумно!
Теперь давайте оценим уклон -
Какое ядро более точное? Мы можем добавить ошибки, которые вы предоставили. Нелинейное ядро имеет общую ошибку ~ 550 + 325 = ~ 875. Линейное ядро имеет ошибку ~ 690 + ~ 50 = ~ 740. Таким образом, линейное ядро в целом выглядит лучше, но в целом они довольно близки. Это было сложно!
Собираем все вместе
Посмотрите, как линейное ядро плохо справилось с 1 и действительно отлично справилось с 0. Это довольно неуравновешенно. Где как нелинейное ядро более сбалансировано. Кажется, что самое приятное в этом вопросе - создать сбалансированную модель, которая не имеет такой высокой дисперсии. Как мы контролируем высокую дисперсию? Бинго - регуляризация. Мы можем добавить регуляризацию к нелинейной модели и, вероятно, увидим гораздо лучшие результаты. Это параметр C в scikit learn SVM, который вы хотите увеличить по умолчанию. Мы также могли бы поиграть с гамма-параметром. Гамма контролирует ширину гауссиана. Может быть, попробуйте увеличить его немного, чтобы получить менее шумные результаты, например, большая ничейная земля между классами.
Надеюсь это поможет!
источник
Если вы использовали ядро по умолчанию в SVC (), ядре Radial Basis Function (rbf), то вы, вероятно, узнали более нелинейную границу решения. В случае набора данных цифр это значительно превзойдет линейную границу решения по этой задаче (см. 3.1 «Базовый линейный классификатор»)
источник