Я использую 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'}