Как напечатать соответствующие веса функций в Scikit SVC? - PullRequest
1 голос
/ 09 мая 2019

Как и в SVM, каждому признаку f [i] соответствует вес w w как коэффициент.Когда все функции масштабированы, w [i] должен представлять важность функции f [i], поэтому я хочу напечатать этот порядок важности.Поэтому я написал быстрый код и использовал clf.coef_, чтобы получить все w [i].Но результат немного странный, для n_features = 2 clf.coef_ выводит матрицу 10x2!

from sklearn import svm
from sklearn.datasets.samples_generator import make_blobs
from pandas import DataFrame
X,Y=make_blobs(n_samples=100, centers=5, n_features=2)

clf=svm.SVC(kernel='linear',probability=True)
clf.fit(X,Y)

print(clf.coef_)

Вывод этого кода: -

[[-0.14808725 -0.30415025]
 [ 0.01612808  0.43529163]
 [-1.06694209 -0.27738544]
 [-0.13195668 -0.27799574]
 [ 0.03588147  0.13657989]
 [ 0.04273599  0.65849432]
 [ 0.68017938 -0.64049715]
 [-0.09071154 -0.22828399]
 [-0.01494555 -0.1300181 ]
 [ 0.10260101 -0.36918253]]

Так, что представляет эта матрица 10x2 и, что более важно, как я могу получить все значения w [i], которые соответствуют каждой функциивес.

1 Ответ

0 голосов
/ 09 мая 2019

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

Причина для матрицы 10 * 2 : (количество ваших классов равно 5, а количество функций равно 2) (документация по sklearn ясна и полезна)

SVC реализует «один против одного» для классификации нескольких классов.Если n_class - это число классов, то создаются классификаторы n_class * (n_class - 1) / 2, и каждый из них обучает данные из двух классов.

Атрибут coef_ SVM выдает то же самое, и массив выглядит следующим образом: [n_class * (n_class-1) / 2, n_features]

Если вы хотите иметь только 5 классификаторов вместо 10, вы можетеЛибо:

  1. Используйте решение_function_shape = "ovr", пока вы определяете / подгоняете свой clf.
  2. Или вы можете использовать Linear SVC (lin_clf = svm.LinearSVC ()) (Это будет использоватьovr по умолчанию)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...