【机器学习】处理样本不平衡的问题

文章目录

  • 样本不均衡的概念及影响
  • 样本不均衡的解决方法
    • 样本层面
      • 欠采样 (undersampling)
      • 过采样
      • 数据增强
  • 损失函数层面
  • 模型层面
    • 采样+集成学习
  • 决策及评估指标

样本不均衡的概念及影响

机器学习中,样本不均衡问题经常遇到,比如在金融风险人员二分类问题中,绝大部分的样本均为正常人群,可用的风险样本较少。如果拿全量样本去训练一个严重高准确率的二分类模型,那结果毫无疑问会严重偏向于正常人群,从而导致模型的失效,所以说,训练样本比例均衡对模型的结果准确性至关重要。
首先来看概念:
【样本不均衡】所谓的样本不平衡问题指的是数据集中正负样本比例极不均衡,样本比例超过4:1的数据就可以称为不平衡数据。

样本不均衡的解决方法

常用的解决方法主要从样本层面、损失函数层面、模型层面以及评价指标等4方面进行优化。

样本层面

欠采样 (undersampling)

imblearn
imblearn库中的欠采样方法包含:
在这里插入图片描述

  1. 随机欠采样
    下面是一个使用随机欠采样的示例代码:
from imblearn.under_sampling import RandomUnderSampler# 创建RandomUnderSampler对象
sampler = RandomUnderSampler(random_state=42)# 对训练数据进行欠采样
X_resampled, y_resampled = sampler.fit_resample(X_train, y_train)

在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

2.集群中心欠采样
集群中心选择欠采样(Cluster Centroids Undersampling):这是一种基于聚类的欠采样方法,它通过聚类算法将多数类别样本聚集到少数类别样本的中心点,从而减少多数类别的数量。同样地,可以使用imbalanced-learn库来实现集群中心选择欠采样。

下面是一个使用集群中心选择欠采样的示例代码:

from imblearn.under_sampling import ClusterCentroids# 创建ClusterCentroids对象
sampler = ClusterCentroids(random_state=42)# 对训练数据进行欠采样
X_resampled, y_resampled = sampler.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

这些方法都可以根据具体情况选择合适的欠采样策略。值得注意的是,欠采样可能会导致信息丢失,因此在应用欠采样之前,需要仔细评估其对模型性能的影响,并选择适当的评估指标来评估模型的效果。

过采样

过采样(Oversampling)是一种处理样本不均衡问题的方法,它通过增加少数类别样本的数量来平衡数据集。在Python中,有多种过采样方法可供选择。以下是几种常用的过采样方法及其示例代码:

1. 复制样本(Duplicate Samples):这是一种简单直接的过采样方法,它通过复制少数类别样本来增加其数量。

import numpy as np# 找出少数类别样本的索引
minority_indices = np.where(y == minority_class_label)[0]# 复制少数类别样本
duplicated_samples = X[minority_indices]# 将复制的样本添加到原始数据集中
X_oversampled = np.concatenate((X, duplicated_samples), axis=0)
y_oversampled = np.concatenate((y, np.ones(len(duplicated_samples))), axis=0)

在上述代码中,X和y分别表示原始数据集的特征和标签。minority_class_label是少数类别的标签。通过复制少数类别样本并将其添加到原始数据集中,我们可以实现过采样。

2.SMOTE(Synthetic Minority Over-sampling Technique):SMOTE是一种基于合成样本的过采样方法,它通过在特征空间中插入新的合成样本来增加少数类别样本的数量。

from imblearn.over_sampling import SMOTE# 创建SMOTE对象
smote = SMOTE(random_state=42)# 对训练数据进行过采样
X_oversampled, y_oversampled = smote.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回过采样后的特征和标签。

3. ADASYN(Adaptive Synthetic Sampling):ADASYN是一种基于合成样本的自适应过采样方法,它根据样本密度来生成合成样本,更关注于那些在决策边界附近的少数类别样本。

from imblearn.over_sampling import ADASYN# 创建ADASYN对象
adasyn = ADASYN(random_state=42)# 对训练数据进行过采样
X_oversampled, y_oversampled = adasyn.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回过采样后的特征和标签。

这些方法都可以根据具体情况选择合适的过采样策略。需要注意的是,过采样可能会导致模型对少数类别样本过拟合的问题,因此在应用过采样之前,需要仔细评估其对模型性能的影响,并选择适当的评估指标来评估模型的效果。

数据增强

损失函数层面

损失函数层面主流的方法也就是常用的代价敏感学习(cost-sensitive),为不同的分类错误给予不同惩罚力度(权重),在调节类别平衡的同时,也不会增加计算复杂度。如下常用方法:
这最常用也就是scikit模型的’class weight‘方法,If ‘balanced’, class weights will be given by n_samples / (n_classes * np.bincount(y)). If a dictionary is given, keys are classes and values are corresponding class weights. If None is given, the class weights will be uniform.,class weight可以为不同类别的样本提供不同的权重(少数类有更高的权重),从而模型可以平衡各类别的学习。如下图通过为少数类做更高的权重,以避免决策偏重多数类的现象(类别权重除了设定为balanced,还可以作为一个超参搜索。示例代码请见github.com/aialgorithm):
在这里插入图片描述

clf2 = LogisticRegression(class_weight={0:1,1:10})  # 代价敏感学习

模型层面

模型方面主要是选择一些对不均衡比较不敏感的模型,比如,对比逻辑回归模型(lr学习的是全量训练样本的最小损失,自然会比较偏向去减少多数类样本造成的损失),决策树在不平衡数据上面表现相对好一些,树模型是按照增益递归地划分数据(如下图),划分过程考虑的是局部的增益,全局样本是不均衡,局部空间就不一定,所以比较不敏感一些(但还是会有偏向性).

采样+集成学习

BalanceCascade
BalanceCascade基于Adaboost作为基分类器,核心思路是在每一轮训练时都使用多数类与少数类数量上相等的训练集,然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制FP(False Positive)率,将所有判断正确的类删除,然后进入下一轮迭代继续降低多数类数量。
在Python中,BalanceCascade是一个用于处理样本不均衡问题的集成学习方法,它基于级联分类器。BalanceCascade通过多次迭代地训练和删除错误分类的样本来减少多数类别的数量,从而实现欠采样。

你可以使用imbalanced-learn库来实现BalanceCascade方法。下面是一个使用BalanceCascade的示例代码:

python

from imblearn.ensemble import BalanceCascade
from sklearn.tree import DecisionTreeClassifier# 创建BalanceCascade对象,并指定基分类器
bc = BalanceCascade(estimator=DecisionTreeClassifier(random_state=42))# 对训练数据进行欠采样
X_resampled, y_resampled = bc.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

BalanceCascade方法会自动进行多轮迭代,每轮迭代都会训练一个基分类器,并删除错误分类的样本。这样,多数类别的样本数量会逐步减少,直到达到平衡。

请注意,BalanceCascade方法可能需要较长的时间来运行,因为它涉及多轮迭代和训练多个分类器。此外,选择合适的基分类器也是很重要的,你可以根据具体情况选择适合的分类器。

你可以在imbalanced-learn官方文档中找到更多关于BalanceCascade方法的详细信息和示例代码。

EasyEnsemble
EasyEnsemble也是基于Adaboost作为基分类器,就是将多数类样本集随机分成 N 个子集,且每一个子集样本与少数类样本相同,然后分别将各个多数类样本子集与少数类样本进行组合,使用AdaBoost基分类模型进行训练,最后bagging集成各基分类器,得到最终模型。示例代码可见:http://www.kaggle.com/orange90/ensemble-test-credit-score-model-example
在Python中,EasyEnsemble是一种用于处理样本不均衡问题的集成学习方法。它通过将原始数据集划分为多个子集,并在每个子集上训练一个基分类器来实现欠采样。

你可以使用imbalanced-learn库来实现EasyEnsemble方法。下面是一个使用EasyEnsemble的示例代码:

from imblearn.ensemble import EasyEnsemble
from sklearn.tree import DecisionTreeClassifier# 创建EasyEnsemble对象,并指定基分类器和子集数量
ee = EasyEnsemble(n_estimators=10, base_estimator=DecisionTreeClassifier(random_state=42))# 对训练数据进行欠采样
X_resampled, y_resampled = ee.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。n_estimators参数表示要生成的子集数量,base_estimator参数表示用于训练每个子集的基分类器。

EasyEnsemble方法会生成多个子集,并在每个子集上训练一个基分类器。最终的预测结果是所有基分类器的投票结果或平均结果,以达到平衡样本不均衡的效果。

请注意,EasyEnsemble方法可能需要较长的时间来运行,因为它涉及生成多个子集并训练多个分类器。同样地,选择合适的基分类器也是很重要的,你可以根据具体情况选择适合的分类器。
你可以在imbalanced-learn官方文档中找到更多关于EasyEnsemble方法的详细信息和示例代码。

通常,在数据集噪声较小的情况下,可以用BalanceCascade,可以用较少的基分类器数量得到较好的表现(基于串行的集成学习方法,对噪声敏感容易过拟合)。噪声大的情况下,可以用EasyEnsemble,基于串行+并行的集成学习方法,bagging多个Adaboost过程可以抵消一些噪声影响。此外还有RUSB、SmoteBoost、balanced RF等其他集成方法可以自行了解。

决策及评估指标

在处理不平衡样本问题时,传统的评价指标(如准确率)可能会给出误导性的结果。因此,为了更准确地评估模型在不平衡数据上的性能,我们通常使用以下评价指标:

1.混淆矩阵(Confusion Matrix):混淆矩阵是一个二维矩阵,用于显示分类器在每个类别上的预测结果。它包含四个重要的指标:真阳性(True Positive, TP),真阴性(True Negative, TN),假阳性(False Positive, FP)和假阴性(False Negative, FN)。根据这些指标,可以计算其他评价指标。

2.精确率(Precision):精确率是指模型预测为正例的样本中,实际为正例的比例。它可以通过以下公式计算:Precision = TP / (TP + FP)。精确率越高,表示模型对于正例的判断越准确。

3.召回率(Recall):召回率是指实际为正例的样本中,模型正确预测为正例的比例。它可以通过以下公式计算:Recall = TP / (TP + FN)。召回率越高,表示模型对于正例的识别能力越强。

4.F1值(F1-Score):F1值是精确率和召回率的调和平均值,用于综合评估模型的性能。它可以通过以下公式计算:F1 = 2 * (Precision * Recall) / (Precision + Recall)。F1值越高,表示模型在精确率和召回率之间取得了更好的平衡。

5.ROC曲线和AUC(Receiver Operating Characteristic Curve and Area Under the Curve):ROC曲线是以假阳性率(False Positive Rate, FPR)为横轴,真阳性率(True Positive Rate, TPR)为纵轴绘制的曲线。AUC表示ROC曲线下的面积,用于衡量模型在不同阈值下的分类性能。AUC的取值范围在0到1之间,越接近1表示模型性能越好。

以上评价指标可以帮助我们更全面地评估模型在不平衡样本上的性能。根据具体问题的需求,选择适当的评价指标来评估模型的效果是非常重要的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解Kafka分区机制原理|Kafka 系列 二

Kafka 系列第二篇,详解分区机制原理。为了不错过更新,请大家将本号“设为星标”。 点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达 上一篇文章介绍了 Kafka 的基本概念和术语,里面有个概念是 分区(Part…

验证码安全志:AIGC+集成环境信息信息检测

目录 知己知彼,黑灰产破解验证码的过程 AIGC加持,防范黑灰产的破解 魔高一丈,黑灰产AIGC突破常规验证码 双重防护,保障验证码安全 黑灰产经常采用批量撞库方式登录用户账号,然后进行违法违规操作。 黑灰产将各种方…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统 em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目…

算法与数据结构-跳表

文章目录 什么是跳表跳表的时间复杂度跳表的空间复杂度如何高效的插入和删除跳表索引动态更新代码示例 什么是跳表 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率…

Makefile

什么是 Makefile 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中, Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编 译,哪些文件需要重新编译,甚至于进行更复杂的功…

Plecs最新安装免费版下载链接/Plecs 电力仿真软件4.7.5版本下载/实测能用

Plecs最新安装免费版下载链接 Plecs 电力仿真软件4.7.5版本下载 实测能用:

Flutter 让软键盘不再自动弹起

1、问题说明: 在开发中,经常遇到这种事,一个页面有输入框,点击输入框后,会弹起软键盘,同时输入框会聚焦,手动收起软键盘后,点击另一个按钮前往下一个页面或者显示一个弹窗&#xff0…

web集群学习--基于CentOS构建LVS-DR集群、配置nginx负载均衡

基于CentOS构建LVS-DR集群 环境准备 主机名 ip地址 node1 192.168.1.140 client node2 192.168.1.141 LVS node3 192.168.1.142 RS1 node4 192.168.1.143 RS2配置 1.关闭防火墙和SELinux [rootclient~]# systemctl stop firewalld [rootclient~]# systemctl disabl…

数据可视化(八)堆叠图,双y轴,热力图

1.双y轴绘制 #双Y轴可视化数据分析图表 #add_subplot() dfpd.read_excel(mrbook.xlsx) x[i for i in range(1,7)] y1df[销量] y2df[rate] #用来正常显示负号 plt.rcParams[axes.unicode_minus]False figplt.figure() ax1fig.add_subplot(1,1,1)#一行一列,第一个区域…

机器学习笔记:李宏毅ChatGPT Finetune VS Prompt

1 两种大语言模型:GPT VS BERT 2 对于大语言模型的两种不同期待 2.1 “专才” 2.1.1 成为专才的好处 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭头方向指的是从哪个方向往哪个方向翻译 表格里面的数值越大表示翻译的越好 可以发现专门做翻…

HOT79-跳跃游戏 II

leetcode原题链接&#xff1a;跳跃游戏 II 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j &…

笔记本WIFI连接无网络【实测有效,不用重启电脑】

笔记本Wifi连接无网络实测有效解决方案 问题描述&#xff1a; 笔记本买来一段时间后&#xff0c;WIFI网络连接开机一段时间还正常连接&#xff0c;但是过一段时间显示网络连接不上&#xff0c;重启电脑太麻烦&#xff0c;选择编写重启网络脚本解决。三步解决问题。 解决方案&a…

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

SDXL 1.0出图效果直逼Midjourney!手把手教你快速体验!

介绍 最近&#xff0c;Stability AI正式推出了全新的SDXL 1.0版本。经过我的实际测试&#xff0c;与之前的1.5版本相比&#xff0c;XL的效果有了巨大的提升&#xff0c;可以说是全方位的超越。不仅在理解提示词方面表现出色&#xff0c;而且图片的构图、颜色渲染和画面细腻程度…

一零六七、JVM梳理

JVM&#xff1f; Java虚拟机&#xff0c;可以理解为Java程序的运行环境&#xff0c;可以执行Java字节码&#xff08;Java bytecode&#xff09;并提供了内存管理、垃圾回收、线程管理等功能 java内存区域划分?每块内存中都对应什么? 方法区&#xff1a;类的结构信息、常量池、…

排序算法(九大)- C++实现

目录 基数排序 快速排序 Hoare版本&#xff08;单趟&#xff09; 快速排序优化 三数取中 小区间优化 挖坑法&#xff08;单趟&#xff09; 前后指针法&#xff08;单趟&#xff09; 非递归实现&#xff08;快排&#xff09; 归并排序 非递归实现&#xff08;归并&am…

奥威BI—数字化转型首选,以数据驱动企业发展

奥威BI系统BI方案可以迅速构建企业级大数据分析平台&#xff0c;可以将大量数据转化为直观、易于理解的图表和图形&#xff0c;推动和促进数字化转型的进程&#xff0c;帮助企业更好地了解自身的运营状况&#xff0c;及时发现问题并采取相应的措施&#xff0c;提高运营效率和质…

【数据结构】双链表

【数据结构】双链表 一. 前言二. 带头双向链表接口实现1.准备工作2. 创建一个节点 三. 初始化4. 打印5. 尾插6. 尾删7. 头插8. 头删9. 计算节点个数10. 查找数据11. 在任意位置插入数据12. 在任意位置删除数据13. 销毁 四. 如何10分钟内完成一个完整双链表 一. 前言 带头双向循…

笔记——听听前辈们的教学评一体化

精选课程内容 强而有力的知识 做中学&#xff0c;用中学&#xff0c;创中学。 这个技术很难做 关于支架的新理解 有价值 有意义 和 趣味性 权衡&#xff0c;不能为了趣味性舍弃价值 举例说明文 被教成了文学作品 导致所教所学 悄然发生了偏移。 所以教学评如何一直&#xff…

Ajax 笔记(一)

笔记目录 1. Ajax 入门1.1 Ajax 概念1.2 axios 使用1.2.1 URL1.2.2 URL 查询参数1.2.3 小案例-查询地区列表1.2.4 常用请求方法和数据提交1.2.5 错误处理 1.3 HTTP 协议1.3.1 请求报文1.3.2 响应报文 1.4 接口文档1.5 案例1.5.1 用户登录&#xff08;主要业务&#xff09;1.5.2…