Несоответствие между прогнозами из sklearn LinearSV C и CalibratedClassifierCV - PullRequest
1 голос
/ 19 июня 2020

Я использую LinearSV C -модель для прогнозирования между 5 классами и использую CalibratedClassifierCV-модель, чтобы получить «вероятности» для каждого класса. Вот мое определение моделей:

from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import LinearSVC

model = LinearSVC()
clf = CalibratedClassifierCV(model,cv="prefit", method="sigmoid")
model.fit(X_train, y_train)
clf.fit(X_train, y_train)

Теоретически я предполагаю, что «model» и «clf» будут давать похожие прогнозы. В большинстве случаев (может быть, 98%) да, но в некоторых случаях (для которых я не могу дать воспроизводимый код) нет, поэтому мой вопрос чисто теоретический.

Когда я бегу:

print(model.classes_)
print(clf.classes_)

Они идентичны. Но когда я бегу:

print(model.decision_function(X_test))
print(clf.decision_function(X_test))

Результат:

array([-0.17743171, -0.10924828, -1.00177102, -0.88501918, -0.93835179])
array([0.68707567, 0.28820641, 0.00613415, 0.01067078, 0.00791299])

То есть - «модель» получает наивысший «вес» для класса номер 2, а «clf» - наивысшую вероятность для класс номер 1. Таким образом, эти две модели дают разные прогнозы. Моя интерпретация Stackoverflow состоит в том, что «clf» должен быть просто сигмоидом значений функции-решения из «модели», и, следовательно, класс с наивысшим весом (из модели) также должен иметь самую высокую вероятность (из clf). Кажется, это не так, поэтому, если кто-то знает почему - объясните мне, пожалуйста!

EDIT: Вот также вывод .get_params () из модели и clf:

print(model.get_params())
print(clf.get_params())
{'C': 1.0,
 'class_weight': None,
 'dual': True,
 'fit_intercept': True,
 'intercept_scaling': 1,
 'loss': 'squared_hinge',
 'max_iter': 1000,
 'multi_class': 'ovr',
 'penalty': 'l2',
 'random_state': None,
 'tol': 0.0001,
 'verbose': 0}
{'base_estimator__C': 1.0,
 'base_estimator__class_weight': None,
 'base_estimator__dual': True,
 'base_estimator__fit_intercept': True,
 'base_estimator__intercept_scaling': 1,
 'base_estimator__loss': 'squared_hinge',
 'base_estimator__max_iter': 1000,
 'base_estimator__multi_class': 'ovr',
 'base_estimator__penalty': 'l2',
 'base_estimator__random_state': None,
 'base_estimator__tol': 0.0001,
 'base_estimator__verbose': 0,
 'base_estimator': LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
           intercept_scaling=1, loss='squared_hinge', max_iter=1000,
           multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
           verbose=0),
 'cv': 'prefit',
 'method': 'sigmoid'}
...