非平衡数据处理-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://xiahunao.cn/news/3016005.html

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

相关文章

[华为OD]C卷 精准核算检测 100

题目: 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测Q带来的浪费,需要精准圈定可 能被感染的人群。现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是 否存在轨迹的交叉现在给定一组确诊人员编号&…

多微信管理不过来?你需要一个微信神器

很多企业都在面临以下几个问题: 1、希望进行微信营销转型,但是不知道如何入手; 2、拥有多个微信号,但不想拿着多台手机,希望能够集中管理所有微信号; 3、希望使用app替代传统的营销体系,并确…

RS0108YQ20功能和参数介绍及高速数据传输中的优势

RS0108YQ20功能和参数介绍及高速数据传输中的优势-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 RS0108YQ20是一款电平转换器,也称为电平移位器,它的主要功能是在不同的电源电压或逻辑电平之间提供双向信号转换。以下是RS0108YQ20的一些关键参数和功能特…

链表成环或多分枝问题

问题概述 这类问题主要和数论结合到一起。 这类问题主要的解决技巧就是画图,跟着图来写代码,不然代码5分钟,调试2小时。 因为每个节点可以指向下一个节点,那么两个节点就可以指向同一个节点;或者链表的末尾节点指向…

JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式

技术栈 1. 开发语言:JAVA 2. 数据库:MySQL 3. 后端框架:Spring boot 4. 前端框架:VUE2 5. 电子班牌: Android 7.1 6. 小程序:原生开发 7. 多学校Saas 模式 电子班牌是一款智慧校园管理工具&#xf…

自动语音识别

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

Linux动态库与静态库解析

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

Python专题:一、安装步骤

1、下载地址:Welcome to Python.org 勾选这个add 其他的全部下一步即可。 运行出现这个即代表安装成功。 Python自带编辑器。 2、推荐使用的sublime 编辑器下载 全部下一步安装。

【QA】Java常见运算符

前言 本文主要讲述Java常见的运算符 运算符的概念 两个基本概念: 运算符:对字面量或者变量进行操作的符号 表达式:用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式 示例: int a 10; int b 20; int …

2024.5.7

槽函数声明 private slots:void on_ed_textChanged();void on_pushButton_clicked(); }; 槽函数定义 void Widget::on_ed_textChanged()//文本框 {if(ui->ed1->text().length()>5&&ui->ed2->text().length()>5){ui->pushButton->setStyleSh…

鸿蒙OpenHarmony【基于Hi3516DV300开发板(时钟应用开发)】

概述 本文将介绍如何快速搭建基于OpenHarmony标准系统(Hi3516DV300开发板)的应用开发环境,并基于一个时钟APP示例逐步展示应用的创建、开发、调试和安装等流程。示例代码可以通过本链接获取。 时钟App是一款显示实时时间的应用,…

js实现json数据可编辑

背景 项目中有低代码平台,由于历史脏数据和非同步编辑的问题,偶尔会出现数据错乱的问题,希望有一个快捷的方式修改数据 之前在用Formily的时候有注意到designable/react 里面的json数据编辑功能非常不错如果能应用到项目里就完美了 design…

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

【JVM】垃圾回收机制(Garbage Collection)

目录 一、什么是垃圾回收? 二、为什么要有垃圾回收机制(GC)? 三、垃圾回收主要回收的内存区域 四、死亡对象的判断算法 a)引用计数算法 b)可达性分析算法 五、垃圾回收算法 a)标记-清除…

【Python爬虫实战入门】:全球天气信息爬取

文章目录 一、爬取需求二、所需第三方库2.1 简介 三、实战案例四、完整代码 一、爬取需求 目标网站:http://www.weather.com.cn/textFC/hb.shtml 需求:爬取全国的天气(获取城市以及最低气温) 目标url:http://www.weath…

C++ | Leetcode C++题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution { public:string simplifyPath(string path) {auto split [](const string& s, char delim) -> vector<string> {vector<string> ans;string cur;for (char ch: s) {if (ch delim) {ans.push_back(mov…

粤嵌—2024/4/26—跳跃游戏 ||

代码实现&#xff1a; 方法一&#xff1a;回溯 历史答案剪枝优化——超时 int *dis;void dfs(int k, int startindex, int *nums, int numsSize) {if (dis[startindex] < k) {return;}dis[startindex] k;for (int i 0; i < nums[startindex]; i) {if (startindex i &…

好久不见,回来看看七年前的你

今天在网上搜东西&#xff0c;突然想到之前在网上记录的点滴成长&#xff0c;回来看看~ 来看看那些年走过的路&#xff0c;小伙还挺真实&#xff0c;有些想法~ 那时&#xff0c;一起在网上记录文字的人&#xff0c;也都慢慢失去了联系~ 确实&#xff0c;深有感触&#xff0c;…

安卓玩机工具----一键备份手机分区 防止全檫除或者格机导致安全数据分区丢失

工具说明; 目前玩机root后有很多格机脚本。模块等等误刷会导致基带信号等等问题&#xff0c;在前面的博文中我有介绍过备份主要数据分区的重要性 。其实对于不了解root和不安装有些模块 外挂等等需要的友友不建议对手机进行root。root后对于手机安全性会有所降低。对于玩家来说…

八.吊打面试官系列-Tomcat优化-深入源码剖析Tomcat如何打破双亲委派

前言 上篇文章《Tomcat优化-深入Tomcat底层原理》我们从宏观上分析了一下Tomcat的顶层架构以及核心组件的执行流程。本篇文章我们从源码角度来分析Tomcat的类加载机制&#xff0c;且看它是如何打破JVM的ClassLoader双亲委派的 Tomcat ClassLoader 初始化 Tomcat的启动类是在…