Как интерпретировать весовые характеристики SVM?

42

Я пытаюсь интерпретировать переменные веса, заданные путем подбора линейного SVM.

(Я использую scikit-learn ):

from sklearn import svm

svm = svm.SVC(kernel='linear')

svm.fit(features, labels)
svm.coef_

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

Знак веса имеет какое-либо отношение к классу?

Остин Ричардсон
источник

Ответы:

55

Для общего ядра трудно интерпретировать веса SVM, однако для линейного SVM на самом деле есть полезная интерпретация:

1) Напомним, что в линейном SVM результатом является гиперплоскость, которая разделяет классы как можно лучше. Веса представляют эту гиперплоскость, давая вам координаты вектора, который ортогональн к гиперплоскости - это коэффициенты, заданные svm.coef_. Давайте назовем этот вектор ш.

2) Что мы можем сделать с этим вектором? Его направление дает нам предсказанный класс, поэтому, если вы берете скалярное произведение любой точки с вектором, вы можете сказать, с какой стороны оно находится: если скалярное произведение положительно, оно принадлежит положительному классу, если оно отрицательно принадлежит к отрицательному классу.

3) Наконец, вы даже можете узнать кое-что о важности каждой функции. Это моя собственная интерпретация, так что убедись сначала. Допустим, SVM найдет только одну функцию, полезную для разделения данных, тогда гиперплоскость будет ортогональна этой оси. Таким образом, вы можете сказать, что абсолютный размер коэффициента относительно других дает представление о том, насколько важной была особенность для разделения. Например, если для разделения используется только первая координата, w будет иметь вид (x, 0), где x - некоторое ненулевое число, а затем | x |> 0.

побитовое
источник
3
Точка 3 является основой для алгоритма RFE с использованием вектора весов линейного SVM для выбора признака (гена): см. Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner
1
@B_Miner спасибо! Я волновался, что, так как я думал об этом самостоятельно, это могло бы быть неправильно (я не из "чистого" CS) - но я предполагаю, что это правильно.
побитовое
1
В чем смысл направления ортогонального вектора, если он разделяет оба класса? Это как-то связано с вкладом разделяющей гиперплоскости в общую вероятность предсказания класса?
Остин Ричардсон
Чтобы выяснить, относится ли знак веса к классу (в линейном случае) - это зависит от особенностей. Например, если прогнозирующие признаки принимают только неотрицательные ( ) значения, то отрицательные веса способствуют отрицательной классификации точек данных. 0
Kdawg
@B_Miner, я думаю, вы имели в виду ссылку на этот документ, а не на другой, написанный Гийоном.
Иосиф
11

Документация довольно полная: для мультиклассируют случае, SVC , который основан на библиотеке libsvm использует параметр один-против-один. В случае линейного ядра n_classes * (n_classes - 1) / 2отдельные линейные бинарные модели подгоняются для каждой возможной пары классов. Следовательно, совокупная форма всех основных параметров, соединенных вместе, равна [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2перехватывает в intercept_атрибуте).

Для бинарной линейной задачи построение графика отделения гиперплоскости от coef_атрибута выполняется в этом примере .

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

ogrisel
источник
1
В документации Sklearn атрибут coef_ имеет форму = [n_class-1, n_features]. Я считаю, что это ошибка.
Наоми
6

Я пытаюсь интерпретировать переменные веса, заданные путем подбора линейного SVM.

Хороший способ понять, как рассчитываются веса и как их интерпретировать в случае линейного SVM, - выполнить вычисления вручную на очень простом примере.

пример

Рассмотрим следующий набор данных, который является линейно отделимым

import numpy as np
X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])

SVM простой

Решение проблемы SVM осмотром

Икс2знак равноИкс1-3весTИкс+бзнак равно0

весзнак равно[1,-1]  бзнак равно-3

2||вес||22знак равно242

с

сИкс1-сИкс2-3сзнак равно0
весзнак равно[с,-с]  бзнак равно-3с

Подставив обратно в уравнение для ширины, мы получим

2||вес||знак равно4222сзнак равно42сзнак равно14

весзнак равно[14,-14]  бзнак равно-34


(Я использую scikit-learn)

Так что я, вот код для проверки наших ручных расчетов

from sklearn.svm import SVC
clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y) 
print('w = ',clf.coef_)
print('b = ',clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
  • w = [[0,25 -0,25]] b = [-0,75]
  • Индексы опорных векторов = [2 3]
  • Вспомогательные векторы = [[2. 3.] [6. -1.]]
  • Количество опорных векторов для каждого класса = [1 1]
  • Коэффициенты вектора поддержки в решающей функции = [[0,0625 0,0625]]

Знак веса имеет какое-либо отношение к классу?

Не совсем, знак весов имеет отношение к уравнению граничной плоскости.

 

Источник

https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf

Ксавье Бурре Сикотт
источник
5

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

abhinna11
источник
3

Отличная статья Гайона и Елисеева (2003). Введение в выбор переменных и функций. Журнал исследований машинного обучения, 1157-1182, гласит: «Создание и выбор подмножеств функций, полезных для построения хорошего предиктора, контрастирует с проблемой поиска или ранжирования всех потенциально релевантных переменных. Выбор наиболее релевантных переменных обычно неоптимален для построения предиктор, особенно если переменные являются избыточными. И наоборот, подмножество полезных переменных может исключать множество избыточных, но соответствующих переменных. "

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

петра
источник