非平衡数据处理-Tomek link算法介绍,代码和实战测评

作者Toby,来源公众号:Python风控模型,非平衡数据处理-Tomek link算法

概述

非平衡数据在金融风控领域、反欺诈客户识别、广告智能推荐和生物医疗中普遍存在。一般而言,不平衡数据正负样本的比例差异极大,如在Kaggle竞赛中的桑坦德银行交易预测和IEEE-CIS欺诈检测数据。对模型而言,不均衡数据构建的模型会更愿意偏向于多类别样本的标签。非平衡数据情况下,模型的准确率指标accuracy不具有太大参考价值,模型实际应用价值降低。如下图所示,为在不均衡数据下模型预测的概率分布。

图片

历史背景

20 世纪 90 年代末,当时南佛罗里达大学的研究生 Niesh V Chawla(SMOTE 背后的主要大脑)正在研究二元分类问题。他正在处理乳房 X 光检查图像,他的任务是构建一个分类器,该分类器将像素作为输入,并将其分类为正常像素或癌变像素。当他达到 97% 的分类准确率时,他非常高兴。当他看到 97.6% 的像素都是正常的时,他的快乐是短暂的。

您可能会想,问题出在哪里?有两个问题

  • 假设在 100 个像素的样本中,98 个像素是正常的,2 个是癌变的,如果我们编写一个程序,它可以预测任何情况都是正常的。分类准确率是多少?高达98%。程序学会了吗?一点也不。

  • 还有一个问题。分类器努力在训练数据中获得良好的性能,并且随着正常观察的增多,它们将更多地专注于学习“正常”类的模式。这就像任何学生知道 98% 的问题来自代数而 2% 来自三角学时会做的那样。他们会安全地忽略三角函数

那么,为什么会出现这个问题,是因为类别的频率或数量之间存在很大的差异。我们称这样的数据集为表现类别不平衡的数据集。正常类称为多数类,稀有类称为少数类。

图片

白色海鸥作为少数群体

这在现实生活中的应用中存在吗?以垃圾邮件检测、假新闻检测、欺诈检测、可疑活动检测、入侵检测等为例,类别不平衡问题就表现出来了。

带来一些平衡的解决方案:

基本方法称为重采样技术。有两种基本方法。

欠采样:-

图片

对多数类进行欠采样或下采样

我们从多数类中随机抽取样本,并使其等于少数类的数量。这称为多数类的欠采样或下采样。

问题:忽略或放弃如此多的原始数据并不是一个好主意。

过采样:-

图片

对少数类进行过采样或上采样

在这里,对少数类应用放回抽样,以创建与多数类中一样多的观测值,并且两个类是平衡的。这称为少数类的过采样或上采样。

问题:重复相同的少数类数据会导致过度拟合。

Tomek's link

今天Toby老师介绍的是Tomek's link。Tomek's link是一种用于处理类不平衡数据集的欠采样方法,通过移除近邻的反例样本来改善模型的性能。这种方法可以有效地解决类别不平衡问题,提高分类器的准确性。


Tomek Links是一种欠采样技术,由Ivan Tomek于1976年开发。它是从Condensed Nearest Neighbors (CNN)中修改而来的一种技术。它可以用于找到与少数类数据具有最低欧几里得距离的多数类数据的所需样本,然后将其删除。

图片

Tomek's link支持多分类器模型。下面是英文原释义:


Tomek's link supports multi-class resampling. A one-vs.-rest scheme is used as originally proposed in.

Tomek'slink的参数如下,具体参考链接:https://imbalanced-learn.org/stable/references/generated/imblearn.under_sampling.TomekLinks.html

图片

图片

下面用示例代码展示一下Tomek's link原理。

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 28 17:30:04 2024
论文和企业建模商务咨询QQ:231469242,微信:drug666123
从0到1Python数据科学之旅
https://study.163.com/series/1202883601.htm?share=2&shareId=400000000398149
"""import matplotlib.pyplot as plt
import seaborn as snssns.set_context("poster")#绘图函数
def make_plot_despine(ax):sns.despine(ax=ax, offset=10)ax.set_xlim([0, 3])ax.set_ylim([0, 3])ax.set_xlabel(r"$X_1$")ax.set_ylabel(r"$X_2$")ax.legend(loc="lower right")#生成少量样本数据和多类样本数据    
import numpy as np
rng = np.random.RandomState(18)
X_minority = np.transpose([[1.1, 1.3, 1.15, 0.8, 0.55, 2.1], [1.0, 1.5, 1.7, 2.5, 0.55, 1.9]]
)
X_majority = np.transpose([[2.1, 2.12, 2.13, 2.14, 2.2, 2.3, 2.5, 2.45],[1.5, 2.1, 2.7, 0.9, 1.0, 1.4, 2.4, 2.9],]
)

如下图展示,X_majority代表多数类数据,X_minority 代表少数类数据。

图片

在上图中,以灰色圆圈突出显示的样本形成了Tomek link,因为它们属于不同的类别,并且彼此是最近的邻居。红色减号代表少数类数据,蓝色加号代表多数类数据。

图片

下面是实现代码:

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 28 17:30:04 2024
论文和企业建模商务咨询QQ:231469242,微信:drug666123
从0到1Python数据科学之旅
https://study.163.com/series/1202883601.htm?share=2&shareId=400000000398149
"""import matplotlib.pyplot as plt
import seaborn as snssns.set_context("poster")#绘图函数
def make_plot_despine(ax):sns.despine(ax=ax, offset=10)ax.set_xlim([0, 3])ax.set_ylim([0, 3])ax.set_xlabel(r"$X_1$")ax.set_ylabel(r"$X_2$")ax.legend(loc="lower right")#生成少量样本数据和多类样本数据    
import numpy as np
rng = np.random.RandomState(18)
X_minority = np.transpose([[1.1, 1.3, 1.15, 0.8, 0.55, 2.1], [1.0, 1.5, 1.7, 2.5, 0.55, 1.9]]
)
X_majority = np.transpose([[2.1, 2.12, 2.13, 2.14, 2.2, 2.3, 2.5, 2.45],[1.5, 2.1, 2.7, 0.9, 1.0, 1.4, 2.4, 2.9],]
)
#
fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(X_minority[:, 0],X_minority[:, 1],label="Minority class",s=200,marker="_",
)
ax.scatter(X_majority[:, 0],X_majority[:, 1],label="Majority class",s=200,marker="+",
)# highlight the samples of interest
ax.scatter([X_minority[-1, 0], X_majority[1, 0]],[X_minority[-1, 1], X_majority[1, 1]],label="Tomek link",s=200,alpha=0.3,
)
make_plot_despine(ax)
fig.suptitle("Illustration of a Tomek link")
fig.tight_layout()fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(X_minority[:, 0],X_minority[:, 1],label="Minority class",s=200,marker="_",
)
ax.scatter(X_majority[:, 0],X_majority[:, 1],label="Majority class",s=200,marker="+",
)# highlight the samples of interest
ax.scatter([X_minority[-1, 0], X_majority[1, 0]],[X_minority[-1, 1], X_majority[1, 1]],label="Tomek link",s=200,alpha=0.3,
)
make_plot_despine(ax)
fig.suptitle("Illustration of a Tomek link")
fig.tight_layout()

我们可以运行TomekLinks采样来删除相应的样本。如果sampling_strategy=“auto”,则只删除多数类中的样本,如下图左图。如果sampling_strategy=“所有”两个样本都将被删除,如下图右图。

图片

下面是实现代码


from imblearn.under_sampling import TomekLinksfig, axs = plt.subplots(nrows=1, ncols=2, figsize=(16, 8))samplers = {"Removing only majority samples": TomekLinks(sampling_strategy="auto"),"Removing all samples": TomekLinks(sampling_strategy="all"),
}for ax, (title, sampler) in zip(axs, samplers.items()):X_res, y_res = sampler.fit_resample(np.vstack((X_minority, X_majority)),np.array([0] * X_minority.shape[0] + [1] * X_majority.shape[0]),)ax.scatter(X_res[y_res == 0][:, 0],X_res[y_res == 0][:, 1],label="Minority class",s=200,marker="_",)ax.scatter(X_res[y_res == 1][:, 0],X_res[y_res == 1][:, 1],label="Majority class",s=200,marker="+",)# highlight the samples of interestax.scatter([X_minority[-1, 0], X_majority[1, 0]],[X_minority[-1, 1], X_majority[1, 1]],label="Tomek link",s=200,alpha=0.3,)ax.set_title(title)make_plot_despine(ax)
fig.tight_layout()plt.show()

lendingclub实验TomekLinks

Toby老师用12万大样本的lendingclub数据集来实验TomekLinks欠采样算法,观察是否真的能够提升模型性能。

在模型竞赛中,TomekLinks的确可以提升模型AUC,但f1_score性能会被牺牲掉。

图片

如下图TomekLinks欠采样后模型AUC性能提升到0.869,而之前模型AUC只有0.856.

图片

Tomek link就介绍到这里,如果您们对人工智能预测模型项目感兴趣,欢迎各大科研机构,研究生博士生论文定制服务联系。

项目联系人:重庆未来之智信息技术咨询服务有限公司,Toby老师,文章末尾有联系方式。

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

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

相关文章

20240503安装HEVC解码器播放H265格式的8K视频

20240503安装HEVC解码器播放H265格式的8K视频 2024/5/3 9:55 缘起:由于youtube支持8K视频了,想尝尝鲜! 主摄像头当然是选择SONY的【夜摄/弱光场景】,根据优选,小米(MI)13Ultra 最佳了。 在开始播…

jenkins目录下的vue3项目——pnpm install后运行报错——奇葩问题解决

昨天到今天,同事那边遇到一个问题,就是关于vue3vite的项目,在执行了自动打包后,运行代码会提示报错的问题。 报错信息如下: 具体错误信息如下: ERROR 11:28:14 [vite] Pre-transform error: Cannot find …

深入探究TCP/IP协议

一、引言 在信息技术飞速发展的今天,网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础,TCP/IP协议确保了全球范围内的数据交换和信息共享。本文将深入探讨TCP/IP协议的概念、特点、组成、相关协…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

【优选算法】——Leetcode——202—— 快乐数

目录 1.题目 2. 题⽬分析: 3.简单证明: 4. 解法(快慢指针): 算法思路: 补充知识:如何求⼀个数n每个位置上的数字的平⽅和。 总结概括 5.代码实现 1.C语言 2.C 1.题目 202. 快乐数 编写一个算法来…

STL vector详解

STL vector详解 1. 简介2. vector的内存机制3. vector 基类源码_Vector_base3.1. vector 基类成员变量3.2. vector 基类方法3.3. _Vector_base 总结 4. vector类4.1. 方法 1. 简介 本文参考vector源码,主要介绍vector的设计思路,了解一些方法的实现原理…

20240506 深度学习高级技术点

1.基于BN层剪枝 基于Batch Normalization (BN)层进行剪枝是一种常用的模型压缩方法,特别是在卷积神经网络(CNNs)中。BN层在训练期间用于加速收敛和提高模型的泛化能力,而在剪枝过程中,BN层提供的统计信息(特别是均值(mean)和方差…

HarmonyOS实战开发-如何通过BlendMode属性来实现挂件和图片的混合

介绍 本实例主要通过BlendMode属性来实现挂件和图片的混合,通过更改不同的混合参数,能够展示不同的混合效果。 效果图预览 使用说明: 1.进入页面,点击挂件区域,进行挂件和图片的混合,点击不同的挂件&…

Golang 开发实战day12 - Pointer

🏆个人专栏 🤺 leetcode 🧗 Leetcode Prime 🏇 Golang20天教程 🚴‍♂️ Java问题收集园地 🌴 成长感悟 欢迎大家观看,不执着于追求顶峰,只享受探索过程 Golang 开发实战day12 - 指针…

Python实验代码定时调起

Python代码实验调参需要等待1小时运行完成,自动将提前设置的5组参数(每组参数有8个)间隔1小时之后让Python代码再次自动依次调起运行其中的一组参数,每次跑完将实验结果写一个文件在本地存储通过邮件发送运行结果到指定QQ邮箱 im…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司,负责当地电网规划、建设、运营和供电服务,下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速,其信息内网中存在大量物理服务器、存储设备…

Linux动态库与静态库解析

文章目录 一、引言二、C/C源文件的编译过程三、静态库1、静态库的定义和原理2、静态库的优缺点3、静态库的创建和使用a、创建静态库b、使用静态库 四、动态库1、动态库的定义和原理2、动态库的优缺点3、动态库的创建和使用示例a、创建动态库b、使用动态库 五、动静态库的比较 一…

Pytorch学习笔记——神经网络基本框架

一、神经网络是什么 神经网络在人工智能和深度学习的领域,一般称为人工神经网络,即ANN(Artificial Neural Network),是一种模仿人脑神经系统工作方式的计算模型。被广泛应用于人工智能、自动控制、机器人、统计学等领域的信息处理中。 二、…

套管外径测量仪 多尺寸型号 规格全可定制

套管(bushing)是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管,后者称为穿墙套管。套管通常用在建筑地下室,是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

【快速幂取模】

求 a 的 b 次方对 p 取模的值&#xff0c;其中 1≤a,b,p≤109 输入 三个用空格隔开的整数a,b和p。 输出 一个整数&#xff0c;表示ab mod p的值。 样例输入 Copy 2 3 9样例输出 Copy 8 思路&#xff1a; 这里借鉴一下大佬的用例&#xff1a; #include<bits/stdc.h&…

idea提示 CreateProcess error=206, 文件名或扩展名太长有哪些具体的解决方法

背景&#xff1a; 项目启动后提示CreateProcess error206&#xff0c;通常我本地是将shorten command line改成如下就可以解决&#xff0c;但是今天遇到一个&#xff0c;无论这里怎么设置都是启动提示扩展名太长&#xff0c;经过一番处理问题终于解决&#xff0c;特此记录一下。…

面试笔记——垃圾回收

对象被垃圾回收的时机 垃圾回收主要面向的是堆中的对象。简单一句就是&#xff1a;如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾&#xff0c;如果定位了垃圾&#xff0c;则有可能会被垃圾回收器回收。 如果要定位什么是垃圾&#xff0c;有两…

分布式锁-快速入门

文章目录 前言一、基础概念1.1 什么是锁1.2 什么是分布式锁1.3 锁和事务的区别二、分布式锁基础理论2.1 为什么要使用分布式锁2.2 分布式锁特性2.3 分布式锁的实现方式总结前言 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题…

TRILL解析

Deep Imitation Learning for Humanoid Loco-manipulation through Human Teleoperation解析 摘要1.简介2. Related work2.1 人形机器人的局部操纵2.2 远程操作示范中的模仿学习 3. 方法 论文链接&#xff1a;https://arxiv.org/abs/2309.01952 论文项目&#xff1a;https://ut…

通过mask得到bbox(numpy实现)

在SAM的加持下&#xff0c;我们很容易得到物体的mask&#xff0c;但是物体的bbox信息通常也很有用。那么&#xff0c;我们可以写一个函数&#xff0c;立马可以通过mask得到bbox。 代码如下&#xff1a; import numpy as npdef mask2bbox(mask):nonzero_indices np.nonzero(m…