python - 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'}
解决方案
推荐阅读
- java - Java Swing GUI - 混乱的界面 - 字段未显示
- javascript - 如何通过表单将数据发布到同一html页面中的某个表格单元格
- c - 如何打印字符串中字符的频率?
- kotlin - 有没有一种简单的方法可以在 Kotlin 中创建和使用大量计数器?
- azure - 如何使用powershell从远程zip文件部署functionapp
- php - Mongo查找值中包含撇号的字符串
- azure-storage - 调用函数“格式”失败:在 0 处“%02d”没有足够的参数:需要索引 1 但总共有 0
- ios - 第二个 UIMenuController 不隐藏
- java - 找不到 android.arch.lifecycle:compailer:1.1.1 错误
- bash - 使用 sed - shell 脚本将文本附加到行尾