类别不平衡

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

  • 一、介绍
    • 1、过采样
    • 2、欠采样
  • 二、过采样
    • 1、SMOTE(常用)
      • 1、算法流程
      • 2、算法实现
      • 3、参数介绍
    • 2、ADASYN(不常用)
      • 1、算法流程:
      • 2、代码实现
  • 三、欠采样
    • 1、Random under-sampling
    • 2、Cleaning under-sampling
      • 1、TomekLinks
      • 2、Edited nearest neighbours
  • 四、联合采样
    • 1、SMOTE叠加TomekLink
    • 2、SMOTE叠加ENN
  • 五、实例
    • 1、加载数据
    • 2、实现过采样
    • 3、问题
    • 4、SMOTENC

一、介绍

研究算法时均认为数据是对称分布的,即正负样本数据相当。现实数据中少数类占比20%,甚至10%都不到,容易对模型算法产生影响。

1、过采样

过采样会随机复制少数样本以增大它们的规模。
在这里插入图片描述

2、欠采样

通过抽样方法,将多数样本变少。解决二分类问题时,可以使用随机抽样方法降低样本数量;解决多分类问题时,使用分层抽样方法。
在这里插入图片描述

二、过采样

1、SMOTE(常用)

  • 错误说法
    先设置超参数,如4,黑色样本为少数类,每个黑色样本中找到黑色附近的4个黑色样本,在该4个样本的连线中间取一个随机差值,记为新增样本。
    在这里插入图片描述
  • 正确说法
    先设置超参数,如4,黑色样本为少数类,每个黑色样本中找到黑色附近的4个黑色样本,对这四个样本做有放回的随机抽样,然后找到黑色样本与随机抽中样本,并随机取差值,生成一个样本。

1、算法流程

1、计算采样比例N,(默认N= 多数样本量/少数样本量)
2、 对每一个少数类样本 x i x_i xi,从其k近邻个少数类样本中有放回地随机抽样N-1个,记为 x i k x_{ik} xik
3、分别与原样本 x i x_i xi按照如下的公式生成新的插值样本
x n e w = x i + r a n d ( 0 , 1 ) ∗ ( x i − x i k ) x_{new}=x_i+rand(0,1)*(x_i-x_{ik}) xnew=xi+rand(0,1)(xixik)

4、重复进行,直到满足停止条件。

2、算法实现

  • 创建不平衡数据集
    在这里插入图片描述
  • 实现SMOTE
from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state = 42)
X_sm, Y_sm = smote.fit_resample(X, y)

# 查看采样后的比例
pd.DataFrame(Y_sm).value_counts()
# 画图看过采样后的数据集
plt.scatter(X_sm[:, 0], X_sm[:, 1], c = Y_sm, cmap = "rainbow",s = 10)

在这里插入图片描述

  • 调整采样比例
smote = SMOTE(sampling_strategy = 0.5, random_state = 42)
X_sm, Y_sm = smote.fit_resample(X, y)

在这里插入图片描述

3、参数介绍

sampling_strategy: default= "auto" 过采样策略,可以为0.5,即调整样本比例为0.5倍;minority:只过采样类别比例最少的样本,多分类时用;not_minority出了最少、最多的样本,其他类别过采样,过采样到和最多类别的样本数量一样多;not_majority:除了最多的样本,其他都进行过采样;all:所有都过采样;也可以传入字典控制过采样的key(类别)、value(数量).
k_neighbors: int = 5, k值

优点:简单清晰,用差值做出的结果,比较随机;缺点:如果一个分类器在原始的少数类数据集上做出了一个错误的负面错误,那么数据复制几次后,分类器就会在新的数据集上出现多次错误。由于生成的是虚拟数据,在实际中,不容易解释。

2、ADASYN(不常用)

1、算法流程:

1、对于每一个少数类样本 x i x_i xi,选择其k个近邻的样本 x i k x_{ik} xik。注意这里的k个近邻样本的选择不区分多数与少数类。
2、计算这K个近邻样本中多数类的比例 r i r_i ri
3、标准化 r i r_i ri得到采样比例,公式为 r i ^ = r i / ∑ i = 1 m r i \hat{r_i}=r_i/\sum_{i=1}^m{r_i} ri^=ri/i=1mri。标准化后使 ∑ i r i ^ = 1 \sum_i\hat{r_i}=1 iri^=1
4、 对每个少数类样本,依照采样比例 r i ^ \hat{r_i} ri^使用SMOTE方法得到插值样本。可以发现,ADASYN方法更倾向于在多数类样本的附近生成新的插值样本。

2、代码实现

from imblearn.over_sampling import ADASYN

adasyn = ADASYN(random_state = 42)
X_ada, Y_ada = adasyn.fit_resample(X, y)

pd.DataFrame(Y_ada).value_counts()
plt.scatter(X_ada[:, 0], X_ada[:, 1], c = Y_ada, cmap = "rainbow",s = 10)

在这里插入图片描述

三、欠采样

1、Random under-sampling

常用的是Random under-sampling,即随机删除多数类样本。这是唯一一种可以精确设置欠采样样本数量的常用欠采样算法,因此冠以Controlled名号,即Controlled under-sampling(控制过采样)。

from imblearn.under_sampling import RandomUnderSampler

rus= RandomUnderSampler(sampling_strategy= 0.5, random_state= 42)   # sampling_strategy=1,控制采样比例
X_rus, Y_rus = rus.fit_resample(X, y)

# 查看采样后的比例
pd.DataFrame(Y_rus).value_counts()
# 画图看过采样后的数据集
plt.scatter(X_rus[:, 0], X_rus[:, 1], c = Y_rus, cmap = "rainbow",s = 10)

在这里插入图片描述

2、Cleaning under-sampling

Cleaning类的欠采样算法无法精确控制欠采样样本的数量

1、TomekLinks

  • 算法过程

当多数类的某样本y和少数类的某样本x,与另外任意样本z,之间的距离d()存在以下关系
d ( x , y ) < d ( x , z ) a n d d ( x , y ) < d ( y , z ) d(x,y)<d(x,z)\qquad and\qquad d(x,y)<d(y,z) d(x,y)<d(x,z)andd(x,y)<d(y,z)
则称x与y之间存在Tomek Link,此时算法可删除多数类样本y以实现欠采样。
可以发现,TomekLinks算法不适合对有清晰边界的两类样本做欠采样。

  • 代码实现
from imblearn.under_sampling import TomekLinks

tl= TomekLinks()
X_tl, Y_tl= tl.fit_resample(X, y)

# 查看采样后的比例
pd.DataFrame(Y_tl).value_counts()

# 画图看过采样后的数据集
plt.scatter(X_tl[:, 0], X_tl[:, 1], c = Y_tl, cmap = "rainbow",s = 10)

在这里插入图片描述

2、Edited nearest neighbours

  • 算法过程
    应用最近邻算法来编辑(edit)数据集, 找出那些与邻居不太友好的样本然后移除。
    具体来说,对每一个多数类样本 x i x_i xi,若其k近邻的全部/大多数样本是多数类,则该多数类样本 x i x_i xi会被保留,否则会被移除。
  • 代码实现
from imblearn.under_sampling import EditedNearestNeighbours

enn= EditedNearestNeighbours(n_neighbors= 42)  # 改变n_neighbors=3 参数以观察欠采样结果
X_enn, Y_enn= enn.fit_resample(X, y)

# 查看采样后的比例
pd.DataFrame(Y_enn).value_counts()

# 画图看过采样后的数据集
plt.scatter(X_enn[:, 0], X_enn[:, 1], c = Y_enn, cmap = "rainbow",s = 10)

在这里插入图片描述

四、联合采样

联合采样(Combination sampling)如果多数类样本有离群值,SMOTE等过采样方法容易在多数类样本中间错误地插入少数类插值,导致类别重叠。这些问题插值可以通过联合使用欠采样方法来解决。 这里我们分别将Tomeks link和Edited nearest-neighbours联接在SMOTE之后,来清除过采样生成的问题插值,以得到一个尽量干净的数据空间。
数据处理方法一直是先过采样再欠采样,顺序不可反。

1、SMOTE叠加TomekLink

代码实现:

from imblearn.combine import SMOTETomek

smote_tomek = SMOTETomek(random_state= 42)
X_smote_tomek, Y_smote_tomek= smote_tomek.fit_resample(X, y)

# 查看采样后的比例
pd.DataFrame(Y_smote_tomek).value_counts()

# 画图看过采样后的数据集
plt.scatter(X_smote_tomek[:, 0], X_smote_tomek[:, 1], c = Y_smote_tomek, cmap = "rainbow",s = 10)

在这里插入图片描述

2、SMOTE叠加ENN

代码实现

from imblearn.combine import SMOTEENN

smote_enn = SMOTEENN(random_state= 42)
X_smote_enn, Y_smote_enn= smote_enn.fit_resample(X, y)

# 查看采样后的比例
pd.DataFrame(Y_smote_enn).value_counts()

# 画图看过采样后的数据集
plt.scatter(X_smote_enn[:, 0], X_smote_enn[:, 1], c = Y_smote_enn, cmap = "rainbow",s = 10)

在这里插入图片描述

五、实例

1、加载数据

df=pd.read_csv('保险数据_全部数据.csv')
df1= df.dropna()
labels= df1.pop("resp_flag")

# 数据类型区分
cat_cols= df1.select_dtypes(include=["object"])   # 分类型变量
num_cols= df1.select_dtypes(include=["int", "float"])   # 数值型变量

# 数据编码
from sklearn.preprocessing import OrdinalEncoder
cat_encode= OrdinalEncoder()
cat_trans= cat_encode.fit_transform(cat_cols)
df_cat= pd.DataFrame(cat_trans, columns= cat_cols.columns)

# 数据标准化
from sklearn.preprocessing import StandardScaler
num_std= StandardScaler()
num_trans= num_std.fit_transform(num_cols)
df_num= pd.DataFrame(num_trans, columns= num_cols.columns)

# 数据合并
data= pd.concat([df_cat, df_num], axis= 1)

2、实现过采样

实现过采样,并查看原数据比例

# SMOTE
from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state = 42)
X_sm, Y_sm = smote.fit_resample(data, labels)

# 查看采样后的比例
pd.DataFrame(Y_sm).value_counts()

在这里插入图片描述

3、问题

在这里插入图片描述
第一列性别分类数据,0、1之外出现小数,这是因为SMOTE做差值导致。如果模型做预测,不需要可解释性,则可以继续使用该方法;如果需要满足可解释性,数据中存在连续型数据时无问题,如果是分类数据,则出现的新增样本无法解释。

4、SMOTENC

SMOTENC会自动区分数值型、分类型数据,避免了SMOTE数据无法解释的问题。

from imblearn.over_sampling import SMOTENC
smote_nc = SMOTENC(categorical_features= cat_cols.columns) # categorical_features参数传入分类型数据集的列名
X_resampled, y_resampled = smote_nc.fit_resample(data.values, labels)

新问题:大部分电脑运行这部分代码会保错,原因是Python版本间更新出现重大变动时,第三方库未同时更新导致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

snap nextcloud 通过不被信任的域名访问

安装向导 — Nextcloud latest 管理手册 latest 文档 find / -name config.php trusted_domains >array (0 > localhost,1 > server1.example.com,2 > 192.168.1.50,3 > [fe80::1:50], ), vim /var/snap/nextcloud/42567/nextcloud/config/config.php vim /va…

Java--多维数组

1.多维数组可以看成是数组的数组&#xff0c;比如二维数组就是一个特殊的一维数组&#xff0c;其每一个元素都是一个一维数组 2.二维数组 下列数组啊可看成一个两行五列的数组 int a[][] new int[2][5]; 3.输出二维数组的第一个数组中具体元素&#xff0c;通过调用打…

Makefile-快速掌握

引用 本文完全参照大佬的文档写的&#xff0c;写这篇文章只是为了梳理一下知识 https://github.com/marmotedu/geekbang-go/blob/master/makefile/Makefile%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md 介绍 Makefile是一个工程文件的编译规则&#xff0c;描述了整个工程的编译…

港风归来‖王晶监制首部民俗电影《民间憋宝传说》定档6月18日

随着暑期档的临近&#xff0c;本月即将上映一部备受期待的电影《民间憋宝传说》&#xff0c;本片被视为香港著名导演王晶的强势回归&#xff0c;重新捍卫属于他的“商业片之王”的宝座&#xff0c;无疑为这部电影增添了浓厚的情感色彩与期待值。 一&#xff1a;港风再现 王晶&…

Linxu开机出现 Generating “/run/initramfs/rdsosreport.txt“解决方案

Linxu开机出现 Generating "/run/initramfs/rdsosreport.txt"解决方案 解决&#xff1a; 一、找这个-root结尾的文件也不一样。 大家可以用ls /dev/mapper查看到自己装的镜像对应的以-root结尾的文件是哪个。 二、所以我们运行的是&#xff1a;xfs_repair /dev/map…

java:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89433361 # 项目代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

Bytebase 2.19.0 - 支持 DynamoDB

Bytebase 2.19.0 支持 DynamoDB 支持独立的 SQL 审核工单。 支持为工单事件配置 Slack 私信通知。 file 支持 PostgreSQL 的 DML 变更事前备份。 为 SQL Server 添加 SQL 审核规则&#xff1a;禁止冗余索引。 重大变更 创建多数据库工单时&#xff0c;不同数据库会共享同…

网络安全知识全景地图V1.0 - 20240616更新

网络安全领域的知识全景涵盖了从基础概念到高级技术的广泛内容。博主基于自身十年多的工作经验结合CISSP认证官方教材按照不同的主题和层次梳理出如下高层次的概览地图&#xff0c;可以帮助个人和组织理解网络安全领域的主题。 1.1. 基础理论 1.1.1. 网络安全概述 网络安全的…

区块链中的gas与转账收款相关概念

区块链是一个经济系统 计算与存储系统都是稀缺的&#xff0c;区块链的工作需要消耗资源共识、trustless需要矿工的工作&#xff0c;而矿工需要激励Transaction的执行有成本&#xff08;gas&#xff09;,gas费成为矿工的奖励ether是这个经济生态系统的通行货币 关心的问题 合…

vue(v-if,v-else-if-else-show)

基本应用 例子 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTE-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

Swift 是 C++ 的最佳继任者

苹果称 Swift 是 C 的最佳继任者 Swift 是苹果公司在 2014 年推出的&#xff0c;一款旨在替代 Objective-C 的编程语言。但苹果语言和运行时总监 Ted Kremenek 在 WWDC24 的主题演讲中表示&#xff0c;Swift 也将取代 C。 “Swift 的安全性、速度和易用性&#xff0c;加上内…

面试题 17.09. 第 k 个数

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;堆和hash表 class Solution { public:int getKthMagicNumber(int k) {if (k < 0) {return -1;}if (k 1) {return 1;}std::unordered_set<int64_t> table;std::vector<int64_t> nu…

Docker部署常见应用之SFTP服务器

文章目录 简介Dockers部署单用户多用户用户信息加密使用SSH密钥认证 参考文章 简介 atmoz/sftp 是一个基于 Docker 的 SFTP 服务镜像&#xff0c;它使用 OpenSSH 来提供 SFTP 服务。这个镜像支持创建单个或多个用户的 SFTP 访问&#xff0c;并允许用户通过 SFTP 协议安全地共享…

GenICam标准(五)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; GenICam标准&#xff08;三&#xff09; GenICam标准&#xff08;四&#xff09; GenICam标准&#xff08;五&#xff09; GenICam标准&#xff08;六&#xff09; 文章目录 系列文…

jupyter notebook中使用不同的anaconda环境及常用conda命令

conda命令 在jupyter notebook中使用不同的anaconda环境其他常用conda命令 在jupyter notebook中使用不同的anaconda环境 创建环境 myenvname 需替换为自己的环境名称 conda create --name myenvname python3.7激活环境 conda activate myenvname 在该环境中安装Jupyter N…

什么是专业的CRM客户管理系统,介绍crm客户管理系统的功能作用

CRM&#xff08;Customer Relationship Management&#xff09;客户管理系统&#xff0c;是现代企业不可或缺的一款管理工具。它集客户信息管理、销售自动化、客户服务与支持、数据分析与决策支持等多项功能于一身&#xff0c;帮助企业实现客户关系的全方位管理&#xff0c;从而…

【AI学习】Together AI的新研究:Together MoA(Mixture of Agents)

第一次听说Mixture of Agents&#xff0c;原来Agent也能混合&#xff0c;有意思&#xff01; 介绍 Together AI的最新研究“Together MoA”&#xff08;Mixture of Agents&#xff0c;代理混合&#xff09;是一种创新的方法&#xff0c;旨在通过结合多个开源大型语言模型&…

proDAD V4最新版软件安装包下载+详细安装步骤

简介&#xff1a; proDAD Adorage 是一款一体化的效果库&#xff0c;完美拥有所有的效果&#xff0c;集所有Adorage卷于一体&#xff0c;该系列包含13种可用套装中的17,000多种效果。 对于每种情况都能获得完美的效果&#xff0c;支持Adobe、avid、Corel、Cyberlink、MAGIX等多…

Setapp:只需一次订阅,即可获得 240 款+ Mac 软件

为一项任务寻找合适的应用程序是一项相当艰巨的任务。过去&#xff0c;最好的办法要么是花费宝贵的时间搜索可靠的评论&#xff0c;要么就是相信无论安装什么软件都能完成任务。 如果你是 Mac 用户&#xff0c;那么 Setapp 将让这一问题成为过去。无需在需要时下载单个程序&am…

special characters are not allowed

处理域名连接nacos读取配置异常 1 项目启动报错2 问题处理3 刷新依赖重启问题解决 1 项目启动报错 使用ip可以正在启动&#xff0c;但是使用域名报下面的错误 2024-06-15 17:37:22.981 ERROR 29268 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : parse …