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

news2024/11/16 16:30:26

文章目录

  • 样本不均衡的概念及影响
  • 样本不均衡的解决方法
    • 样本层面
      • 欠采样 (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.coloradmin.cn/o/827463.html

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

相关文章

安全文件传输:如何避免数据泄露和黑客攻击

网络安全问题日益严重,导致许多数据被泄露和黑客袭击的事件频发。为了保证文件传输的安全,需要实施一系列安全文件传输策略来防止数据被泄露和黑客袭击。 第一、选择适合的加密方法是非常关键的 加密是一种将明文转换成密文的过程,这样只有授…

再探python装饰器

参考视频教学: 可能是b站上最好的Python装饰器教程_哔哩哔哩_bilibili 【python】如何在class内部定义一个装饰器?这里的坑你要么不知道,要么不会填!_哔哩哔哩_bilibili 推荐!先学习第一个视频,再学习第…

Selenium 根据元素文本内容定位

使用xpath定位元素时,有时候担心元素位置会变,可以考虑使用文本内容来定位的方式。 例如图中的【评价】按钮,只有按钮文本没变,就可以定位到该元素。 xpath内容样例: # 文本内容完全匹配 //button[text()"评价&…

赋能教育数字化转型,经管大数据课程教学训练营线下培训圆满收官!

全面推进教学教改、加快学科专业交叉融合,2023年7月30日,由邮电出版有限责任公司联合上海和今信息科技有限公司(下简称“和鲸科技”)、山东省中国石油大学(华东)大数据人才培训示范基地主办的“数字化转型背…

【三等奖方案】Web攻击检测与分类识别赛题「Cyan」团队解题思路

2022 CCF BDCI 数字安全公开赛「Web攻击检测与分类识别」赛题Cyan战队获奖方案 地址:http://go.datafountain.cn/4Zj 团队简介 团队成员来自中国科学院大学,对数据挖掘与网络安全有浓厚兴趣,曾多次获得大数据安全分析等比赛的Top名次。希望…

网络:SecureCRT介绍

1. 使用Tab键补全时出现^I,如下操作

MySQL数据库服务器的简化(此操作针对开发人员,不推荐运维人员)

目录 引言 一,5.7之前版本简化 二,5.7之后版本简化 引言 简化数据库只是为了让数据库文件更小更简单。对于开发人员来说是一个不错的选择,h是将数据库只用于简单的数据操作,但是对于运维人员来说就是灾难。 建议每次删除前可以备…

vscode 通过mongoose 连接mongodb atlas

了解mongodb 的项目结构 1.代表集群名称 > 2.代表数据库名称>3.代表每个 collection名称 三者范围为从大到小的关系 (一对多)。每个集群有不同的连接地址、用户信息(Database Access)、ip配置信息(Network Acce…

安全狗V3.512048版本绕过

安全狗安装 安全狗详细安装、遇见无此服务器解决、在windows中命令提示符中进入查看指定文件夹手动启动Apache_安全狗只支持 glibc_2.14 但是服务器是2.17_黑色地带(崛起)的博客-CSDN博客 安全狗 safedogwzApacheV3.5.exe 右键电脑右下角安全狗图标-->选择插件-->安装…

Vue3基础(1)

1.简单的vue实例 1.data函数介绍 也可以修改data里的数据 2.自定义函数 调用函数 3.Vue模板语法 (1).V-html (2)三目运算符的支持 (3)对函数的支持 (4)v-bind 值动态修改 4.指令 1.v-if和v-else的使用

数据截断、频谱泄漏与窗函数的选择

目录 数据截断、频谱泄漏与窗函数的选择 什么是频谱泄漏? 解决频谱泄漏问题的方法 主瓣和旁瓣 窗函数介绍 窗函数解决频谱泄漏问题的原理 窗函数的种类、特点和如何使用 1、矩形窗 2、三角窗 3、汉宁窗 4、海明窗 5、布莱克曼窗 6、巴特窗:…

docker 保存和载入镜像

查看本机docker镜像 docker images保存镜像 docker save -o /home/space/work1/docker_qnx7.1.tar.gz a01ee6d74c36复制镜像到其他服务器 scp /home/space/work1/docker_qnx7.1.tar.gz XXXIP:/home/dell/work1/登录新 服务器操作 docker load -i docker_qnx7.1.tar.gz载入后…

滇医通微信小程序分析笔记

注意 本文章仅供学习交流使用,如果你是铁粉你就会知道博主之前发布过一篇相关的文章,但是由于代码涉及到法律相关所以就隐藏了,两年的时间过去了,因为女朋友已经早早安排上了,所以就搁置了,本次不做代码分…

【Linux】Linux服务器连接百度网盘:实现上传下载

【Linux】Linux服务器连接百度网盘:实现上传下载 文章目录 【Linux】Linux服务器连接百度网盘:实现上传下载1. 前言2. 具体过程2.1 pip 安装所需包2.2 认证(第一次连接需要认证)2.3 下载所需文件或者目录2.4 其他指令使用2.5 注意…

Vue3和typeScript路由传参

1 params传的参数,页面刷新就消失,而query传的参数,页面刷新还会存在,所以通常用query。 query传参 跳转页面:拿到router对象,调用push方法做跳转. import { useRoute,useRouter} from "vue-router"; export default…

SAP自建表日志

文章目录 1.在表里加上日志记录字段1.1 加入日志结构1.2 在代码中调用记录日志通用函数1.3 在SM30里面记录日志1.4 缺点1.5 优点 2.表技术设置-日志数据更改2.1 RZ10或者RZ11修改系统参数2.2 设置表的属性2.3 查询日志2.4 缺点2.5 优点 3 SCDO文档对象3.1 勾选相应字段-数据元素…

Redis的订阅者和发布者模式、主从双备和密码认证

四、Redis的订阅者和发布者模式、主从双备和密码认证 1、Redis的订阅者和发布者模式 两个数据库,一个是10,一个是15。订阅频道: 向频道推数据: 接收到数据: 2、redis的高可用(HA)主从双备 模拟…

C++——类与对象(中)

目录 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时…

使用树莓派picow和drv8833驱动直流电机

raspberry pico w引脚图 1. 准备工作 板子编辑器raspberry pico wmicropython(thonny编辑器) 最新的raspberry pi pico w系统包下载地址。 点亮板载led灯 需要注意的是pico的板载led灯是GPIO25引脚,picow的板子led灯则直接用Pin包的&qu…

【1++的C++初阶】之继承

👍作者主页:进击的1 🤩 专栏链接:【1的C进阶】 文章目录 一,什么是继承?二,基类和派生类对象赋值转换三,派生类的默认成员函数四,继承与友元,静态成员五&…