首页 > 解决方案 > sklearn LinearSVC 和 CalibratedClassifierCV 的预测不匹配

问题描述

我正在使用 LinearSVC 模型在 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)

从理论上讲,我的猜测是“模型”和“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”应该只是“模型”中的决策函数值的 sigmoid,因此权重最高的类(来自模型)也应该具有最高的概率(来自 clf)。情况似乎并非如此,所以如果有人知道原因 - 请向我解释!

编辑:这也是模型和 clf 的 .get_params() 输出:

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'}

标签: pythonscikit-learnsvm

解决方案


推荐阅读