Scikit Узнать SVC decision_function и предсказать

Я пытаюсь понять взаимосвязь между decision_function и прогнозом, которые являются примерами методов SVC ( http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html ). Пока что я собрал эту функцию решения, возвращает парные оценки между классами. У меня создалось впечатление, что прогноз выбирает класс, который максимизирует его парный балл, но я тестировал это и получал разные результаты. Вот код, который я использовал, чтобы попытаться понять взаимосвязь между ними. Сначала я сгенерировал парную матрицу очков, а затем напечатал класс с максимальным парным счетом, который отличался от класса, предсказанного clf.predict.

result = clf.decision_function(vector)[0] counter = 0 num_classes = len(clf.classes_) pairwise_scores = np.zeros((num_classes, num_classes)) for r in xrange(num_classes): for j in xrange(r + 1, num_classes): pairwise_scores[r][j] = result[counter] pairwise_scores[j][r] = -result[counter] counter += 1 index = np.argmax(pairwise_scores) class = index_star / num_classes print class print clf.predict(vector)[0] 

Кто-нибудь знает взаимосвязь между этими предсказывающими и решающими функциями?

4 Solutions collect form web for “Scikit Узнать SVC decision_function и предсказать”

Я не совсем понимаю ваш код, но давайте рассмотрим пример страницы документации, на которую вы ссылаетесь:

 import numpy as np X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) y = np.array([1, 1, 2, 2]) from sklearn.svm import SVC clf = SVC() clf.fit(X, y) 

Теперь давайте применим как функцию решения, так и предсказываем образцы:

 clf.decision_function(X) clf.predict(X) 

Мы получаем:

 array([[-1.00052254], [-1.00006594], [ 1.00029424], [ 1.00029424]]) array([1, 1, 2, 2]) 

И это легко интерпретировать: функция desion говорит нам, на какой стороне гиперплоскости генерируется классификатор мы (и насколько далеко мы от него). Основываясь на этой информации, оценщик затем маркирует примеры соответствующей меткой.

Когда вы вызываете decision_function() , вы получаете результат от каждого из парных классификаторов (общее число n * (n-1) / 2). См. Стр. 127 и 128 «Машины поддержки векторов для классификации шаблонов» .

Каждый классификатор ставит вопрос о правильном ответе (на основе знака выхода этого классификатора); predict() возвращает класс с наибольшим количеством голосов.

Для тех, кого это интересует, я отправлю быстрый пример функции predict переведенной с C ++ ( здесь ) на python:

 # I've only implemented the linear and rbf kernels def kernel(params, sv, X): if params.kernel == 'linear': return [np.dot(vi, X) for vi in sv] elif params.kernel == 'rbf': return [math.exp(-params.gamma * np.dot(vi - X, vi - X)) for vi in sv] # This replicates clf.decision_function(X) def decision_function(params, sv, nv, a, b, X): # calculate the kernels k = kernel(params, sv, X) # define the start and end index for support vectors for each class start = [sum(nv[:i]) for i in range(len(nv))] end = [start[i] + nv[i] for i in range(len(nv))] # calculate: sum(a_p * k(x_p, x)) between every 2 classes c = [ sum(a[ i ][p] * k[p] for p in range(start[j], end[j])) + sum(a[j-1][p] * k[p] for p in range(start[i], end[i])) for i in range(len(nv)) for j in range(i+1,len(nv))] # add the intercept return [sum(x) for x in zip(c, b)] # This replicates clf.predict(X) def predict(params, sv, nv, a, b, cs, X): ''' params = model parameters sv = support vectors nv = # of support vectors per class a = dual coefficients b = intercepts cs = list of class names X = feature to predict ''' decision = decision_function(params, sv, nv, a, b, X) votes = [(i if decision[p] > 0 else j) for p,(i,j) in enumerate((i,j) for i in range(len(cs)) for j in range(i+1,len(cs)))] return cs[max(set(votes), key=votes.count)] 

Существует много входных аргументов для predict и decision_function , но обратите внимание, что все они используются внутри модели при вызове predict(X) . Фактически, все аргументы доступны вам внутри модели после установки:

 # Create model clf = svm.SVC(gamma=0.001, C=100.) # Fit model using features, X, and labels, Y. clf.fit(X, y) # Get parameters from model params = clf.get_params() sv = clf.support_vectors nv = clf.n_support_ a = clf.dual_coef_ b = clf._intercept_ cs = clf.classes_ # Use the functions to predict print(predict(params, sv, nv, a, b, cs, X)) # Compare with the builtin predict print(clf.predict(X)) 

Вероятно, они имеют немного сложное математическое отношение. Но если вы используете LinearSVC decision_function в классификаторе LinearSVC , связь между этими двумя будет более понятной! Потому что тогда decision_function даст вам оценки для каждого ярлыка класса (не так же, как SVC), и прогнозирование даст класс с лучшим результатом.

Python - лучший язык программирования в мире.