SVM分类器的概率校准在scikit-learn 中的几种实现方式

机器学习的模型校准 机器学习分类问题的模型校准 阅读详情

SVM分类器的分类结果只有类别,没有概率,属于maximum-margin 的方法

如果我们想从SVM的分类结果中得到属于某个类别的置信概率,就要用到 概率校准

经典的概率校准思路有Platt Scaling,核心思想就是把分类的结果作为新的训练集,用logistics回归再训练一个关系,得到具体的概率值

P(y=1∣x)=11+e(A∗f(x)+B) P ( y = 1 ∣ x ) = 1 1 + e ( A ∗ f ( x ) + B )

具体的理论知识不赘述了,可以看文后引用的参考文献

scikit-learn 中进行概率校准很简单

1)有专门的函数 CalibratedClassifierCV,可以对训练好的分类器模型进行校准,校准过程用到了cross-validation,参数cv就是这个意思。

可选的方法有

 sigmoid: 就是Platt Scaling 的 方法(我的理解)

 isotonic: 用isotonic 回归替代了sigmoid,大体思路一样

这样的校准不仅用于SVC,还可以用在其他各种分类器上

2)专就SVC而言,sklearn 中也提供了一个参数,只要设置 ‘probability = True’,就可以获得预测概率,很简单

这个参数的实现原理也是Platt Scaling

概率校准结果的评价用Brier 分数。

Brier 分数反映预测概率的准确性,越小越好,等于0时,意味着完全正确,等于1时,意味着预测的概率完全不准。

下面是三种方法在Iris Flower 数据集上的应用的代码,分数不同,但反映不了具体的性能,仅供参考

0.导入相关的库

import numpy as np
from sklearn import datasets
from sklearn.svm import LinearSVC,SVC
from sklearn.preprocessing import StandardScaler
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import brier_score_loss
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt

1.导入Iris Flower 数据集

#只导入前两类,用两个类别100个数据
iris = datasets.load_iris()
X = iris.data[:100]
y = iris.target[:100]

2.数据标准化

scalar = StandardScaler()
X = scalar.fit_transform(X)

3.划分数据集

X_train, X_test = train_test_split(X,test_size = 0.2,random_state = 42)
y_train,y_test = train_test_split(y,test_size =0.2,random_state = 42)
y_test
array([1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0])

4.训练线性SVM分类器

linear_svc = LinearSVC(C=1.0)
clf = linear_svc.fit(X_train,y_train)
#随便选一个数据,作为后续预测的例子
x_sample = [X_train[66]]
y_sample = y_train[66]
y_sample
0
clf.predict(x_sample)
array([0])

5.概率校准

5.1 使用 isotonic regression
clf_isotonic = CalibratedClassifierCV(clf,cv=2,method = 'isotonic')
clf_isotonic.fit(X_train,y_train)
CalibratedClassifierCV(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=2, method='isotonic')
clf_isotonic.predict_proba(x_sample)
array([[1., 0.]])
5.2 使用sigmoid (Platt scaling)
clf_sigmoid = CalibratedClassifierCV(clf,cv=2,method = 'sigmoid')
clf_sigmoid.fit(X_train,y_train)
CalibratedClassifierCV(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=2, method='sigmoid')
clf_sigmoid.predict_proba(x_sample)
array([[0.95372182, 0.04627818]])
5.3 SVC 分类器自带参数校准(Platt scaling)
SVC_prob = SVC(kernel = 'linear',probability = True,random_state=0)
clf_prob = SVC_prob.fit(X_train,y_train)
clf_prob.predict_proba(x_sample)
array([[0.97512656, 0.02487344]])

6.使用Brier 分数评价结果

# isotonic 方法在测试集上对类别0 的预测概率
y_pred_isotonic = clf_isotonic.predict_proba(X_test)[:,0]
y_pred_isotonic
array([0.        , 0.        , 0.        , 1.        , 1.        ,
       1.        , 1.        , 0.        , 1.        , 1.        ,
       1.        , 1.        , 0.        , 1.        , 0.        ,
       1.        , 0.        , 0.        , 1.        , 0.99224446])
clf_isotonic_score = brier_score_loss(y_test,y_pred_isotonic,pos_label=0)
clf_isotonic_score
3.007423463740823e-06
# sigmoid 方法在测试集上对类别0 的预测概率
y_pred_sigmoid = clf_sigmoid.predict_proba(X_test)[:,0]
y_pred_sigmoid
array([0.00868318, 0.02838737, 0.01635684, 0.91598769, 0.94559943,
       0.95382487, 0.98198061, 0.06049953, 0.96589119, 0.96322886,
       0.95022074, 0.93235678, 0.03351543, 0.98424352, 0.04139341,
       0.96987556, 0.01385618, 0.00854675, 0.94583165, 0.91734167])
y_pred_sigmoid_score = brier_score_loss(y_test,y_pred_sigmoid,pos_label=0)
y_pred_sigmoid_score
0.0020438257628262657
# “SVC 参数” 方法在测试集上对类别0 的预测概率
y_pred_prob = clf_prob.predict_proba(X_test)[:,0]
y_pred_prob
array([8.01673220e-06, 1.14149792e-02, 3.07476903e-03, 9.61672027e-01,
       9.67162468e-01, 9.77874749e-01, 9.94306123e-01, 3.01072891e-02,
       9.81856911e-01, 9.83148483e-01, 9.65382710e-01, 9.69897739e-01,
       9.03854695e-03, 9.92058842e-01, 1.60902778e-02, 9.86984501e-01,
       1.55278635e-05, 3.76329999e-06, 9.78982637e-01, 9.46469035e-01])
y_pred_prob_score = brier_score_loss(y_test,y_pred_prob,pos_label = 0)
y_pred_prob_score
0.000535674433908579

参考文献

概率校准-sklearn 文档
Platt Scaling -wiki
Isotonic regression -wiki
Brier分数-sklearn 文档

机器学习:概率校准 之前已经讲过了逻辑回归,这里不再细讲,只是简单的说一个函数,主要是方便大家更好的理解概率校准。在逻辑回归中,用的最多的就是sigmod函数,这个函数的作用就是把无限大或者无限小的数据压缩到[0,1]之间,用来估计概率。图像大致为:基本上是以0.5分界,0.5以上为1,0.5以下为0。但是这个分界值可以自己设定。 阅读详情

相关推荐

你可能不知道的 7 个 Scikit-Learn 秘密

预定义拆分是一个 Scikit-Learn 类,用于自定义交叉验证策略。它指定了训练和测试数据拆分时的模式。当我们想要以某种方式拆分数据,而标准的 K 折或分层 K 折不够用时,这是一种很有价值的方法。让我们使用下面的代码尝试预定义分割。在上面的例子中,我们通过选择前 100 个数据作为训练,其余数据作为测试来设置数据拆分方案。拆分策略取决于您的需求。我们可以通过加权过程进行调整。该策略为数据分割过程提供了一种新颖的看法,因此请尝试一下,看看它是否能为您带来好处。

分享各种技术文章,给大家带来不一样的视野。 1191

从组合中估计概率

一些分类算法缺乏输出结果为概率的能力,比如rf 这个时候使用calibratedclassifiercv,它使用2种方法将分类结果转化为概率 第一种:platte的归类方法 第二种:isotonic回归 import pandas as pd import matplotlib.pyplot as plt from sklearn.calibration import Calibrate...

kylin_learn的博客 693

Scikit-Learn 支持向量机学习

1、支持向量机是一种有监督的学习方法,可以用来做分类、回归和离群点检测。 2、支持向量机的优缺点: 优点 在高维空间是有效的当特征的维数比样本数量多的时候仍然有效在决策函数中仅使用支持向量,能够节省内存能够支持多种不同的核函数 缺点 当特征的数量远多于样本数量时,性能表现差SVMs 并不直接给出概率估计 3、分类 a. SVC,NuSVC,LinearSVC 能够进行

夜晓楼的博客 959

SVM分类器如何输出预测实例的概率值

支持向量机分类器能够输出测试实例与决策边界之间的距离,你可以将其用作信心分数。但是这个分数不能直接转化成类别概率的估算。如果创建SVM时,在Scikit-Learn中设置probability=True,那么训练完成后,算法将使用逻辑回归对SVM分数进行校准(对训练数据额外进行5-折交叉验证的训练),从而得到概率值。 这会给SVM添加predict_proba()和predict_log_prob...

qq_38236355的博客 2万+

Scikit-Learn中SVM实战:二分类与多分类调参避坑指南

支持向量机(SVM)是一种基于最大间隔原理的监督学习算法,其核心在于通过核技巧将数据映射到高维空间并寻找最优超平面。在工程落地中,SVM的性能高度依赖特征缩放、核函数选择与超参数协同调优——尤其是C(正则化强度)和gamma(RBF核尺度)的物理意义直接影响模型泛化能力。它广泛应用于金融风控、医疗影像、工业缺陷检测等对决策边界可解释性要求高的场景;在二分类任务中提供清晰的分类距离输出,在多分类任务中需权衡one-vs-one与one-vs-rest策略的稳定性与效率。本文聚焦Scikit-Learn实现细节

weixin_33834137的博客 556

Scikit-learn分类器实战:从数据理解到可解释模型交付

分类器不是黑盒预测工具,而是基于数据分布、特征语义与业务逻辑的决策边界建模过程。其核心原理在于通过特征空间划分实现离散标签判别,技术价值体现在可复现性、可调试性与业务可解释性三重保障。典型应用场景包括用户信用评分、工业故障预警、金融风控初筛等需兼顾精度与归因能力的任务。区别于回归建模,分类任务强调类别不平衡处理、标签不可变换性、以及OneHot/Target Encoding等特有预处理策略。本文聚焦Scikit-learn生态下的全流程实操——从pandas数据加载陷阱规避、EDA三图诊断法,到基于原理的

cqwf95925的博客 444

Scikit-Learn 1.4使用指南: 有监督学习 概率校准 Probability Calibration

Niculescu-Mizil和Caruana给出了一个解释:“诸如bagging和随机森林之类的方法,这些方法从一组基本模型的预测中平均预测,可能在接近0和1的预测上出现困难,因为基本模型的方差会使应该接近零或一的预测偏离这些值。”因此,校准曲线显示了一个特征的S形状,表明分类器可以更加相信自己的“直觉”,通常返回更接近0或1的概率。较低的Brier损失并不一定意味着更好的校准模型,它也可能意味着校准更差的模型,但具有更强的区分能力,例如使用更多的特征。在预测概率时,会分别预测每个类别的校准概率。

数智笔记 2183

【Python机器学习】零基础掌握CalibratedClassifierCV概率校准

CalibratedClassifierCV 主要用于校准分类器的预测概率,使之更接近真实概率。这对于业务决策,特别是需要概率输出的场景(如客户流失预测)非常有用。优点总结,优点主要集中在提高模型预测概率的准确性,从而提高模型的业务应用价值。优点名称描述说明概率校准提高预测概率的准确性灵活性支持多种基础分类器易于集成与 scikit-learn 兼容良好缺点总结。缺点主要在于可能的计算复杂度增加和对数据量的要求。缺点名称描述说明计算复杂度可能增加模型的计算时间数据依赖性。

Mr数据杨 793

scikit-learn概率校准技术:提升分类模型预测准确率的完整指南

在机器学习分类任务中,我们不仅希望模型能够正确预测类别标签,更希望获得准确的概率估计来评估预测的置信度。**scikit-learn概率校准技术**正是解决这一需求的关键工具,能够显著提升分类模型的预测准确率。 ## 为什么需要概率校准? 许多分类模型虽然能够输出概率预测,但这些概率往往存在偏差,不能真实反映样本属于某个类别的可能性。例如,一个预测概率为0.8的样本,在实际中应该有80%的概率

gitblog_00638的博客 929

sklearn.CalibratedClassifierCV校准分类器预测概率

概率校准就是调整分类器输出的概率,使其更接近真实的概率分布,这样可以提高模型在需要可靠概率估计的任务中的性能,比如风险评估、决策分析等。库中用于校准分类器预测概率的一个类。在机器学习中,许多分类器输出的概率可能并不准确,也就是所谓的 “提供了一种方便的方式来对分类器进行概率校准,从而在需要可靠概率估计的场景中获得更好的性能。

Cachel Wood的博客 443

Python 结合 scikit - learn 进行模型预测的不确定性估计

在机器学习模型的实际应用中,单纯的点预测往往不足以支持关键决策。了解预测的不确定性对于风险评估、决策制定和模型可信度评估至关重要。本文旨在全面介绍如何使用scikit-learn库来估计和解释机器学习模型预测的不确定性。文章首先介绍不确定性估计的基本概念,然后深入探讨scikit-learn中的相关技术,包括概率预测、集成方法和自定义不确定性估计器。随后通过实际案例展示实现方法,最后讨论应用场景和未来趋势。预测不确定性:模型对特定预测结果不确定程度的量化表示概率校准。

AI Python 编程之道的博客 691

基于Scikit-learn的kNN分类器性能评估实验报告

优化策略测试精度变化耗时变化原始kNN98.3%0.8ms/样本KD树加速98.3%0.2ms/样本特征选择(2/4)96.7%0.1ms/样本。

HeaViolet的博客 1284

告别两个电源模块!用UCD3138+四开关Buck-Boost,一个电路搞定电池充放电(附原理图分析)

本文详细介绍了采用UCD3138数字控制器和四开关Buck-Boost拓扑的双向DC/DC变换器设计,实现单一电路完成电池智能充放电管理。该方案显著降低BOM成本和PCB面积,提升系统效率至96.2%,适用于UPS、通信基站和储能系统,具有高效、紧凑和成本优势。

weixin_30256901的博客 397

【机器学习】你可能不知道的 7 个 Scikit-Learn 秘密

具备 Python 编程技能的数据科学家经常使用 Scikit-Learn。它是一个机器学习库,通常最先被教授给新用户,并且可以一直使用到生产环境。然而,大多数被教授的只是基础实现,而 Scikit-Learn 实际上包含了许多可以提升我们数据工作流的秘密。本文将讨论 7 个你可能不知道的 Scikit-Learn 秘密。

等风来 929

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2578

GATK SNP过滤参数优化:从标准到个性化调整的实践指南

本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。

weixin_29216049的博客 275

SVM多分类实战:从OvR与OvO策略到Scikit-learn实现

支持向量机(SVM)作为经典的机器学习算法,其核心原理是通过寻找最优超平面实现数据分类,并最大化分类间隔以提升模型鲁棒性。这一特性使其在解决复杂分类问题时展现出重要技术价值,尤其在需要高精度分类的场景中,如手写数字识别、文本分类等。在实际工程应用中,面对多类别分类任务,SVM通常采用“一对其余”或“一对一”策略进行扩展。其中,“一对其余”策略在类别不均衡时需警惕模型偏向问题,而“一对一”策略则通过精准的捉对厮杀提升分类稳定性,但计算开销较大。本文聚焦于SVM的多分类实战,结合Scikit-learn库,深入

weixin_29035147的博客 322

机器学习——径向基函数(RBF)神经网络

目录 一、什么是基函数 二、什么是径向基函数 三、为什么RBF神经网络使用一个径向基函数作为隐含层的激活函数 四、参数训练 五、RBF网络vs BP网络和 SVM 一、什么是基函数 著名的傅里叶变换是指:n个有参(权值)的正、余弦三角函数基的和式可以等价的表示任意一个周期函数,这里的“基”和我们数学中说的坐标基或向量基含义相同,即坐标空间中任意一个向量都可以用基向量的线性和表示出来。 因此,我们引入函数空间的概念,函数空间中的每个连续函数可以表示为基函数的线性组合,就像向量空间中的每..

CHWB2580的博客 6272

Scikit-Learn 1.4实战案例:分类模型

首先需要注意的是,对于第一个和第二个数据集,LDA和QDA是等价的。由于在这些情况下数据生成过程对两个类别使用了相同的协方差矩阵,QDA估计了两个(几乎)相等的协方差矩阵,因此等价于LDA估计的协方差矩阵。QDA拟合了两个协方差矩阵,并提供了一个非线性的判别边界,而LDA则欠拟合,因为它假设两个类别共享一个单一的协方差矩阵。在第一个数据集中,用于生成数据集的协方差矩阵是球形的,这导致判别边界与两个均值的垂直平分线对齐。使用LDA时,所有类别的标准差相同,而使用QDA时,每个类别都有自己的标准差。

数智笔记 1344

gdb对dwarf调试信息的解析和使用

gdb的对dwarf的调试信息的解析到使用的过程分析

JS072110的专栏 9568

如何在 SAP Server Side JavaScript 里消费 destination

在SAP云平台里打开SAP HANA Web-Based Development Workbench进行服务器端JavaScript的开发。 创建一个新的package: 创建一个新的application: 创建一个新的文件google-distance-api.xshttpdest用于维护destination相关信息: host = "maps.googlea...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 613

Scikit-Learn逻辑回归实战精要:从概率建模到业务可解释性

逻辑回归并非简单的二分类工具,而是基于广义线性模型的概率校准器,其核心是通过sigmoid链接函数将线性组合映射为(0,1)区间内的事件发生概率。理解其数学本质(GLM+log loss)与scikit-learn实现细节(如solver选择、C参数的权衡意义),是避免误用的前提。技术价值在于高可解释性、稳定概率输出和轻量部署能力,适用于风控评分、点击率预估、用户流失预警等需量化风险的场景。本文聚焦LogisticRegression在真实数据流中的关键咬合点——标准化必要性、CV自动调参、系数与Odds

weixin_30172941的博客 293

C++11、C++14 和 C++17 标准新特性详解

特性C++11C++14C++17auto类型推导✅范围 for 循环✅Lambda 表达式✅✅✅智能指针✅移动语义✅nullptr✅统一初始化{}✅✅constexpr✅✅✅✅数字分隔符✅结构化绑定✅✅✅文件系统库✅。

h a 6 6 6 c k 为 你解决复杂难题! 440

SVM——输出概率值

https://blog.youkuaiyun.com/flyfrommath/article/details/78139719

qq_41870157的博客 3044

SKUA-GOCAD入门教程-第八节 线的创建与编辑7和8

本文介绍了曲线编辑操作的主要功能,包括曲线部分和区域的管理操作。在曲线部分操作方面,详细说明了如何合并、删除、移动和过滤曲线部分,支持精确或带公差的合并方式。在曲线区域操作方面,阐述了保留/删除区域点、移动区域点、保留/删除区域线段等操作。此外还介绍了节点连接功能,包括新增/删除连接、端点连接以及为曲线赋予地质特征的方法。

江洋大葱的博客 390

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: SVM 解决类别不平衡问题(scikit_learn)
下一篇: C++ 短路求值特性的利用
Codename-NC
博客等级 码龄12年 38粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值