【Python机器学习】非均衡分类问题

news2024/11/22 14:24:41

在大多数情况下不同类比的分类代价并不相等。

分类性能度量指标:正确率、召回率及ROC曲线

通常情况下,我们可以基于错误率来衡量分类器任务的成功程度。错误率指的是在所有测试样例中错分的样例比例。实际上,这样的度量错误掩盖了样例如何被分错的事实。在机器学习中,有一个普遍适用的称为混淆矩阵的工具,它可以帮助人们更高地了解分类中的错误。有这样一个关于子啊房子周围可能发现的动物类型的预测,混淆矩阵如图:

利用混淆矩阵就可以更好地理解分类中的错误了。如果矩阵中的非对角元素均为0,就得到了一个完美的分类器。

接下来,是一个简单的二类问题的混淆矩阵:

在这个二类问题中,如果一个正例判为正例,那么就可以认为产生了一个真正例(TP、真阳);如果一个反例正确地判为反例,则认为产生了一个真反例(TN、真阴)。相应的,另外两种情况则分别被称为伪反例(FP、假阴)和伪正例(FN假阴)。

在分类中,当某个类别的重要性高于其他类别时,我们就可以利用上述定义来定义出多个比错误率更好的指标。第一个指标是正确率,它等于TP/(TP+FP),给出的是预测为正例的样本中真正正例的比例。第二个指标是召回率,它等于TP/(TP+FN),给出的是预测为正例的真实正例占所有真实正例的比例。在召回率很大的分类器中,真正判错的正例的数目并不多。

我们可以很容易构造出一个高正确率或者高召回率的分类器,但是很难同时保证两者成立。如果任何样本都判为正例,那么召回率达到100%但争取率很低。构造一个同时使争取率和召回率最大的分类器是具有挑战性的。

另一个用于度量分类中的非均衡性的工具是ROC曲线,ROC代表接收者操作特征。

ROC曲线给出的是当阈值变化时假阳率和真阳率的变化情况。左下角的点对应的是将所有样例判为反例的情况,右上角的点对应的是所有样例判为正例的情况。

ROC曲线不但可以用于比较分类器,还可以基于成本效益分析来做出决策。由于在不同阈值下,不同的分类器的表现情况可能各不相同,因此以某种方式将它们组合起来或许会更有意义。

在理想的情况下,最佳的分类器应该尽可能处于左上角,这就意味着分类器在假阳率很低的同时获得了很高的真阳率。例如在垃圾邮件的过滤中,这就相当于过滤了所有的垃圾邮件,但没有将任何合法邮件误识为垃圾邮件。

对不同的ROC曲线进行比较的一个指标是曲线下的面积(AUC)。AUC给出的是分类器的平均性能值,当然它并不能完全代替对整条曲线的观察。一个完美分类器的AUC为1.0,而随机猜测的AUC约为0.5。

为了画出ROC,分类器必须提供每个样例被判为阳性或者阴性的可信程度值。尽管大多数分类器都能做到这一点,但通常情况下,这些值会在最后输出离散分类标签之前被清除。朴素贝叶斯能够提供一个可能值,而在Logistic回归中输入到sigmoid函数中的是一个数值。在AdaBoost和SVM中,都会计算出一个数值然后输入到sign()中。所有的这些值都可以用于衡量给定分类器的预测强度。为了创建ROC曲线,首先要将分类样例按照其预测强度排序。先从排名最低的样例开始,所有排名更低的样例都被判为反例,而所有排名更高的样例都被判为正例。该情况就对应点<1.0,1.0>。然后,将其一刀排名次低的样例中去,如果该样例属于正例,那么对真阳例进行修改;如果该样例属于反例,那么对假阴率进行修改。

代码实现:

from numpy import *

def plotROC(predStrengths,classLabels):
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    cur=(1.0,1.0)
    ySum=0.0
    numPosClass=sum(array(classLabels)==1.0)
    yStep=1/float(numPosClass)
    xStep=1/float(len(classLabels)-numPosClass)
    #获取排好序的索引
    sortedIndiecies=predStrengths.argsort()
    fig=plt.figure()
    plt.clf()
    ax=plt.subplot(111)
    for index in list(sortedIndiecies.tolist)[0]:
        if classLabels[index]==1.0:
            delX=0
            delY=yStep
        else:
            delX=xStep
            delY=0
            ySum=ySum+cur[1]
        ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY],c='b')
        cur=(cur[0]-delX,cur[1]-delY)
    ax.plot([0,1],[0,1],'b--')
    plt.xlabel('假阳性率')
    plt.ylabel('真阳性率')
    plt.title('ROC曲线')
    plt.show()

函数中有两个输入参数,第一个参数是一个NumPy数组或者一个行向量组成的矩阵。该参数代表的则是分类器的预测强度。在分类器和训练函数将这些数值应用到sign()函数之前,它们就已经产生了。第二个输入参数是标签列表。

我们首先导入pyplot,然后构建一个浮点数二元组,并将它初始化为(1.0,1.0)。该元组保留的是绘制光标的位置,变量ySum则用于计算AUC的值。接下来,通过数组过滤方式计算正例的数目,并将该值赋给numPosClas。该值先是确定了在y坐标轴上的步进数目,接着在x轴和y轴的0.0到1.0区间上绘点,因此y轴上的步长是1.0/numPosClas。类似的就可以得到x轴的步长了。

接下来,我们得到了排序索引,但是这些索引是按照最小到最大的顺序排列的,因此我们需要从点<1.0,1.0>开始绘制,一直到<0.0,0.0>。跟着的三行代码则是用于构建画笔,并在所有排序值手机上进行循环。这些值在一个NumPy数组或者矩阵中进行排序,Python则需要一个表来进行迭代循环,因此我们需要将它转为list。当遍历表时,每得到一个标签为1.0的类,则要沿着y轴的方向下降一个步长,即不断降低真阳率。类似的,对于其他每个类别的标签,则是在x轴方向上倒退了一个步长(假阴率方向)。上述代码只关注1这个类别标签,因此就无所谓是采用1/0标签还是+1/-1标签。

为了计算AUC,我们需要对多个小矩形的面积进行累加,这些小矩形的宽度是xStep,因此可以先对所有巨星的高度进行累加,最后再乘以xStep得到其总面积。所有高度的和(ySum)随着x轴的每次移动而渐次增加。一旦决定了是在x轴还是y轴方向上进行移动的,我们就可以在当前点和新店之间画出一条线段。然后,更新当前点cur。最后,我们就会得到一个像样的绘图并将AUC打印到终端输出。

这事后,我们就得到了一条ROC曲线。

基于代价函数的分类器决策控制

除了调节分类器的阈值之外,我们还有一些其他可以用于处理非均衡分类的代价的方法,其中的一种称为代价敏感的学习

上图中,第一张表给出的是目前为止分类器的代价矩阵(代价不是0就是1),我们可以基于该代价矩阵计算其总代价:TP*0+FN*1+FP*1+TN*0。第二张表中,基于该代价矩阵的分类代价的计算公式为TP*(-5)+FN*1+FP*50+TN*0。采用第二张表作为代价矩阵时,两种分类错误的代价是不一样的。类似的,这两种正确分类所得到的收益也不一样。如果构建分类器时,知道了这些代价值,那么就可以选择付出最小代价的分类器。

在分类算法中,我们有很多方法可以用来引入代价信息。在AdaBoost中,可以基于代价函数来调整错误权重向量D。在朴素贝叶斯中,可以选择具有最小期望代价而不是最大概率的类别作为最后的结果。在SVM中,可以在代价函数中对于不同的类别选择不同的参数C。上述做法就会给较小类更多的权重,即在训练时,小类当中只允许更少的错误。

处理非均衡问题的数据抽样方法

另外一种针对非均衡问题调节分类器的方法,就是对分类器的训练数据进行改造。这可以通过欠抽样或者过抽样来实现。过抽样意味着复制样例,而欠抽样意味着删除样例。不管采用哪种方式,数据都会从原始数据改造为新形式。抽样过程则可以通过随机方式或者某个预定方式来实现。

通常也会存在某个罕见的类别需要我们来识别。如前所述,正例类别属于函件类别。我们希望对于这种函件类别能尽可能保留更多的信息,因此,我们应该保留正例类别中的所有样例,而反例类别进行欠抽样或者样例删除处理。这种方法的一个缺点就在于要确定哪些样例需要进行剔除。但是,在选择剔除的样例中可能携带了剩余样例中并不包含的有价值信息。

上述问题的一种解决办法,就是选择那些离决策边界较远的样例进行删除。

要对正例离别进行过抽样,我们可以复制已有样例或者假如与已有样例相似的点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

image.convert()函数转换格式及显示图像的RGB三通道图像

引 言 视觉任务处理的图片按照图像通道深度分为单通道图像和多通道图像。单通道图像有grayscale灰度图、binary二值图、PNG图&#xff0c;多通道图像有三通道24位真彩色RGB图&#xff0c;8位伪彩色图像&#xff0c;YCbCr图像等。本文先介绍各种格式图像的特点&#xff0c;随后讲…

c++初阶-----STL---list

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

playwrite今日头条自动发帖

目的 大家好&#xff0c;我是watchpoints &#xff0c;一个只为自己打工程序员&#xff0c; watchpoints是我github用户名 &#xff0c;也是我的wechat 用户名&#xff0c; 每天看新闻浪费大量时间&#xff0c;写一个程序 自动提醒你21点远离手机 python实现 步骤1:自动登录 # …

在 Linux 9 上安装 Oracle 19c:克服兼容性问题 (INS-08101)

Oracle 数据库 19c 的基础版本 (19.3) 发布的时候还没有 Linux 9 &#xff0c;因此在Linux 9上面安装Oracle 19c会遇到很多兼容性问题。本文将探讨如何解决这些问题。 安装步骤 设置环境变量以绕过操作系统检查&#xff1a; Oracle 19.3 安装程序无法识别 Linux 9。 [WARNIN…

sql二次注入实战--2018年网顶杯

网址&#xff1a;BUUCTF在线评测 (buuoj.cn) 当我们进入后显示这个页面&#xff1a; 当我们第一次点击发帖的时候就会跳转到登陆页面&#xff0c;上面有提示&#xff0c;告诉我们账号为zhangwei,密码为zhangwei***&#xff1a; 这里我们可以使用bp抓包工具来进行暴力破解密码&…

《剑来》语句摘录(十二)

◆ 第二百零三章 休要略过不提 >> 怨怼与仇恨是快刀斩乱麻&#xff0c;一往无前。金铁相错&#xff0c;激起的火星&#xff0c;就是大丈夫的恩怨分明。无非敢作敢当。 愧疚和遗憾却是一把钝刀&#xff0c;刀刃上边的缺口&#xff0c;皆是曾经犯过的错误。关门磨刀即是后悔…

LVS四层架构部署

LVS四层架构部署 LVS集群的类型 lvs-nat&#xff1a; 修改请求报文的目标IP,多目标IP的DNATlvs-dr&#xff1a; 操纵封装新的MAC地址lvs-tun&#xff1a; 在原请求IP报文之外新加一个IP首部lvs-fullnat&#xff1a; 修改请求报文的源和目标IP LVS-NAT 工作流程 可以理解na…

主从备份(复制)

一、备份的三种类型 备份的三种主要类型包括热备份、逻辑备份和物理备份&#xff0c;每种备份类型都有其特定的应用场景和优缺点。 1. 热备份 定义&#xff1a; 热备份是在数据库或系统处于正常运行状态下进行的备份。这种备份方式允许在不停机的情况下对数据库或系统数据进…

用Python构建一个简单的神经网络

准备工作 首先我们需要使用到vscode 在终端 窗口下输入安装&#xff1a;pip3 install tensorflow pandas numpy keras 代码编写 导入库 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import panda…

PyTorch深度学习实战(3)—— 小试牛刀:CIFAR-10分类

下面尝试从零搭建一个PyTorch模型来完成CIFAR-10数据集上的图像分类任务&#xff0c;步骤如下。 &#xff08;1&#xff09;使用torchvision加载并预处理CIFAR-10数据集。 &#xff08;2&#xff09;定义网络。 &#xff08;3&#xff09;定义损失函数和优化器。 &#xff08;4…

面向服务架构(SOA)介绍

在汽车电子电气架构还处于分布式时代时&#xff0c;汽车软件的开发方式主要是采用嵌入式软件进行开发&#xff0c;而随着汽车智能化程度的加深&#xff0c;更加复杂且多样的功能需求让汽车软件在复杂度上再上一层。在整车的自动驾驶方面&#xff0c;由于未来高阶自动驾驶能力的…

JavaScript constructor原型原型继承

constructor 在 JavaScript 中&#xff0c;构造函数是一种特殊的函数&#xff0c;使用 new 关键字来调用&#xff0c;用于创建对象实例。JavaScript 中的构造函数通常通过 function 关键字定义。 例如&#xff1a; function Person(name, age) {this.name name;this.age a…

C语言预处理:开启编程新境界

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 预处理符号 在C语言中&#xff0c;我们可以通过一些预定义符号查看文件的…

vue中post请求返回二进制流文件下载

1 .调用接口返回的如下图所示,此时看到是一个流文件 2.不管是get请求还是post请求都需要加上 下面这行代码 responseType: "blob", 3.我们自行二次封装的axios可能会导致乱码现象,建议直接用axios调用接口请求 4.关于Excel导出 POI 响应头设置 Content-Type: applica…

Tomcat高可用集群(实例详解)

一.环境准备 虚拟机的版本&#xff1a;VMware-workstation-full-15.5.6-16341506.exe系统镜像版本&#xff1a;CentOS-6.10-x86_64-bin-DVD1.iso&#xff0c;全新安装&#xff0c;桌面版&#xff0c;可上网系统内存大小&#xff1a;1GB系统硬盘大小&#xff1a;20GB连接工具版…

《决胜B端 产品经理升级之路》 知识点总结

什么是b端产品&#xff1f; b端产品是指面向企业或组织的经营管理问题&#xff0c;旨在解决企业规模、成本、效率、品质和风控等方面的产品。这些产品主要帮助企业提高运营效率、降低成本、改善品质和控制风险等。b端产品适用于各种行业和企业类型&#xff0c;可以为企业带来深…

WordPress原创插件:disable-gutenberg禁用古腾堡编辑器和小工具

WordPress原创插件&#xff1a;disable-gutenberg禁用古腾堡编辑器和小工具 disable-gutenberg插件下载:https://download.csdn.net/download/huayula/89616495

【zlm】针对单个设备的音频的编码的设置

目录 结论 原理 测试 结论 为了防止zlm音频配置里设置成opus优先&#xff0c;在国标推流时&#xff0c;调用push时&#xff0c;默认加上codecpcma 如下 https://10.60.100.196:10443/index/api/webrtc?applive&streamtest&typepush&codecpcma 原理 测试 …

ASP.Net Core设置接口根路径的方法

使用asp.net core开发微服务项目&#xff0c;需要给每个服务设置不同的根路径&#xff0c;这样既能使用网关转发请求&#xff0c;又方便对单个服务进行测试&#xff0c;保证请求路径的统一。 设置方法需要使用中间件&#xff0c;在Program.cs添加如下代码 app.UsePathBase(&qu…

量化投资基础(四)之AR、MA、ARMA与ARIMA模型

点赞、关注&#xff0c;养成良好习惯 Life is short, U need Python 量化投资基础系列&#xff0c;不断更新中 1 引言 时间序列经典模型主要有: 自回归模型&#xff08;Auto Regressive&#xff0c;AR&#xff09;移动回归模型&#xff08;Moving Average&#xff0c;MA&…