特征工程:数据平衡

news2024/11/20 20:40:06

目录


一、前言

二、正文

Ⅰ.基于过采样算法

Ⅱ.基于欠采样算法

Ⅲ..基于过采样和欠采样的综合算法

三、结语


一、前言

大多数情况下,使用的数据集是不完美的,会出现各种各样的问题,尤其针对分类问题的时候,会出现类别不平衡的问题。例如:在垃圾邮件分类时,垃圾邮件数据会有较少的样本量,从而导致两种类型的邮件数据量差别很大;在欺诈监测数据集中,往往包含的欺诈样本并没有那么多。处理这类数据集的分类的时候,需要对数据集的类不平衡问题进行处理。 

二、正文

  

Ⅰ.基于过采样算法

from imblearn.datasets import make_imbalance
from imblearn.over_sampling import KMeansSMOTE,SMOTE,SVMSMOTE
from imblearn.under_sampling import AllKNN,CondensedNearestNeighbour,NearMiss
from imblearn.combine import SMOTEENN,SMOTETomek
im_x,im_y=make_imbalance(pca_wine_x,wine_y,sampling_strategy={0:30,1:70,2:20},randim_state=12)
print(np.unique(im_y,return_counts=True))
#输出结果
(array([0, 1, 2]), array([30, 70, 20], dtype=int64))

首先准备不配合的数据将其读取,这些都是前面用过的。imblearn则是专门处理数据不平衡问题的库。

kmeans=KMeansSMOTE(random_state=123,k_neighbors=3)
kmeans_x,kmeans_y=kmeans.fit_resample(im_x,im_y)
print("KMeansSMOTE:",np.unique(kmeans_y,return_counts=True))
smote=SMOTE(random_state=123,k_neighbors=3)
smote_x,smote_y=smote.fit_resample(im_x,im_y)
print("SMOTE:",np.unique(smote_y,return_counts=True))
svm=SVMSMOTE(random_state=123,k_neighbors=3)
svm_x,svm_y=svm.fit_resample(im_x,im_y)
print("SvmSMOTE:",np.unique(svm_y,return_counts=True))

SVMSMOTE
#输出结果
KMeansSMOTE: (array([0, 1, 2]), array([71, 70, 70], dtype=int64))
   SMOTE:    (array([0, 1, 2]), array([70, 70, 70], dtype=int64))
  SvmSMOTE:  (array([0, 1, 2]), array([70, 70, 53], dtype=int64))

针对数据平衡方法---过采样,可使用以上方法。

接下来我们通过可视化,把类别数据量展现:

colors=['red','blue','green']
shape=['o','s','*']
fig=plt.figure(figsize=(10,6))
plt.subplot(2,2,1)
plt.title('Ori')
for ii,y in enumerate(im_y):
      plt.scatter(im_x[ii,0],im_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(2,2,2)
plt.title('Kmeans')
for ii,y in enumerate(kmeans_y):
      plt.scatter(kmeans_x[ii,0],kmeans_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(2,2,3)
plt.title('smote')
for ii,y in enumerate(smote_y):
      plt.scatter(smote_x[ii,0],smote_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(2,2,4)
plt.title('svms')
for ii,y in enumerate(svm_y):
      plt.scatter(svm_x[ii,0],svm_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.show()

 让三种数据的类别比例接近 1:1:1,用四个图来对比更加直观。

 

不同算法生成的位置是有所差异的,在少样本的数据类周围生成新的样本数量。 

Ⅱ.基于欠采样算法

cnn=CondensedNearestNeighbour(random_state=123,n_neighbors=7,n_seeds_S=20)
cnn_x,cnn_y=cnn.fit_resample(im_x,im_y)
print("CondensedNearestNeighbour:",np.unique(cnn_y,return_counts=True))

allknn=AllKNN(n_neighbors=10)
allknn_x,allknn_y=allknn.fit_resample(im_x,im_y)
print("AllKNN:",np.unique(allknn_y,return_counts=True))


nmiss=NearMiss(n_neighbors=3)
nmiss_x,nmiss_y=nmiss.fit_resample(im_x,im_y)
print("NearMiss:",np.unique(nmiss_y,return_counts=True))

#输出结果
CondensedNearestNeighbour: (array([0, 1, 2]), array([20, 22, 20], dtype=int64))
AllKNN: (array([0, 1, 2]), array([22, 56, 20], dtype=int64))
NearMiss: (array([0, 1, 2]), array([20, 20, 20], dtype=int64))

针对数据平衡的方法一一欠采样,如上介绍的方法都是使用特定的方法减少样本数量较多类别的样本量,从而使三种数据的样本接近1:1:1。通过可视化有如下效果:

from imblearn.under_sampling import AllKNN,CondensedNearestNeighbour,NearMiss
colors=['red','blue','green']
shape=['o','s','*']
fig=plt.figure(figsize=(14,10))
plt.subplot(2,2,1)
plt.title('Ori')
for ii,y in enumerate(im_y):
      plt.scatter(im_x[ii,0],im_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(2,2,2)
plt.title('CondensedNearestNeighbour')
for ii,y in enumerate(cnn_y):
      plt.scatter(cnn_x[ii,0],cnn_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(2,2,3)
plt.title('AllKNN')
for ii,y in enumerate(allknn_y):
      plt.scatter(allknn_x[ii,0],allknn_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(2,2,4)
plt.title('svms')
for ii,y in enumerate(nmiss_y):
      plt.scatter(nmiss_x[ii,0],nmiss_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.show()

没有什么特别的变化,只是改变了要展现的变量名,然后通过迭代散点绘制而成。 

从中可以看出三种欠采样算法都是减少样本量较多的数据样本,但是不同的算法减去的样本位置和数量有所差异。 

Ⅲ..基于过采样和欠采样的综合算法

from imblearn.combine import SMOTEENN,SMOTETomek
smoteenn=SMOTEENN(random_state=123)
smoteenn_x,smoteenn_y=smoteenn.fit_resample(im_x,im_y)
print("SMOTEENN:",np.unique(smoteenn_y,return_counts=True))
#输出结果
SMOTEENN: (array([0, 1, 2]), array([67, 64, 69], dtype=int64))

smoteet=SMOTETomek(random_state=123)
smoteet_x,smoteet_y=smoteet.fit_resample(im_x,im_y)
print("SMOTETomek:",np.unique(smoteet_y,return_counts=True))
#输出结果
SMOTETomek: (array([0, 1, 2]), array([69, 69, 70], dtype=int64))

根据上面三种也是能够看出类别比例接近1:1:1,但是只有后者的方法更加接近这个规律,那我们通过可视化观察一番:

colors=['red','blue','green']
shape=['o','s','*']
fig=plt.figure(figsize=(14,10))
plt.subplot(1,2,1)
plt.title('Smoteenn')
for ii,y in enumerate(smoteenn_y):
      plt.scatter(smoteenn_x[ii,0],smoteenn_x[ii,1],s=40,c=colors[y],marker=shape[y])

plt.subplot(1,2,2)
plt.title('Smoteet')
for ii,y in enumerate(smoteet_y):
      plt.scatter(smoteet_x[ii,0],smoteet_x[ii,1],s=40,c=colors[y],marker=shape[y])


plt.show()

 方法也是没有多大的改变,照葫芦画瓢。

与其他采样的结果一样,可以看到样本位置上的差异。

三、结语

数据分析的整个过程的介绍就结束了,那接下来就是关于模型的选择与评估问题,只不过对数据分析着实重要,在之后的几篇当中,我们需要对数据分析有着更加细致的了解或者案例切入。

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

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

相关文章

《MySQL 简易速速上手小册》第5章:高可用性和灾难恢复(2024 最新版)

文章目录 5.1 构建高可用性 MySQL 解决方案5.1.1 基础知识5.1.2 重点案例:使用 Python 构建高可用性的电子商务平台数据库5.1.3 拓展案例 5.2 数据备份策略和工具5.2.1 基础知识5.2.2 重点案例:使用 Python 实现 MySQL 定期备份5.2.3 拓展案例 5.3 灾难恢…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-卷积码原理

目录 一、引言 二、卷积编码的发展历史 2.1 卷积码的起源 2.2 主要发展阶段 2.3 重要里程碑 三、卷积编码的基本概念 3.1 基本定义 3.2 编码器框图 3.3 编码多项式 3.4 网格图(Trellis)描述 四、MATLAB示例 一、引言 卷积编码,作为数字通信领域中的一项…

redis双写一致

redis双写一致,指的是redis缓存与mysql数据同步 双写一致常见方案有很多: 同步双写:更新完mysql后立即同时更新redis mq同步:程序在更新完mysql后,投递消息到中间键mq,一个程序监听mq,获得消…

用EXCEL从地址(上海)中提取各区(浦东新区等区)信息

背景: 朋友工作需要经常用EXCEL把各上海用户收货地址中的区提取出来,之前一直手动处理,希望我帮忙用EXCEL公式直接提取处理。 数据样式: 中国上海市浦东新区A小区 上海徐汇区B小区 中国,上海,浦东新区&a…

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

【05】C++ 内存管理

文章目录 🌈 Ⅰ C 内存分布🌈 Ⅱ C 内存管理方式1. new 和 delete 操作内置类型2. new 和 delete 操作自定义类型 🌈 Ⅲ operator new 和 operator delete🌈 Ⅳ new 和 delete 的实现原理1. 内置数据类型2. 自定义数据类型 &#…

leetcode 3027. 人员站位的方案数 II【离散化前缀和+枚举】

原题链接:3027. 人员站位的方案数 II 题目描述: 给你一个 n x 2 的二维数组 points ,它表示二维平面上的一些点坐标,其中 points[i] [xi, yi] 。 我们定义 x 轴的正方向为 右 (x 轴递增的方向)&#x…

架构之模板方法等模式的使用

目录 一、程序编写背景 二、编程思路讲解 - 类图 - 实现逻辑 - 工厂模式 - 模板方法模式 接口类(代码)抽象类(代码)具体实现类(代码)工厂类(代码)注册类(代码&…

租用海外服务器丢包是什么情况?

在当今的互联网时代,海外服务器租用已经成为了许多企业和个人的选择。然而,在使用海外服务器的过程中,有时会出现丢包的情况,这给用户带来了不小的困扰。那么,租用海外服务器丢包是什么情况呢?本文将对此进…

【Python】Mac 本地部署 stable-diffusion

其实要在本地部署 stable-diffusion 不难,只要有“魔法”一切都水到渠成,如下图: (base) MacBook-Pro python % git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui Cloning into stable-diffusion-webui... remote: Enu…

开发JSP应用程序

开发JSP应用程序 问题陈述 TecknoSoft Pvt Ltd.公司的首席技术官(CTO)John Barrett将创建一个应用程序的任务委托给了开发团队,该应用程序应在客户访问其账户详细信息前验证其客户ID和密码。客户ID应是数字形式。John希望如果所输入的客户ID或密码不正确,应向客户显示错误…

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多,操作方式各有不同,于是JAVA提供了一套规则 ——JMS,用于操作消息中间件。JMS即Java消息服务 (JavaMessage Service)应用程序接口,是一个Java平台中关于面 向消息中间件的…

ssm+vue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结…

在本地运行大型语言模型 (LLM) 的六种方法(2024 年 1 月)

一、说明 (开放)本地大型语言模型(LLM),特别是在 Meta 发布LLaMA和后Llama 2,变得越来越好,并且被越来越广泛地采用。 在本文中,我想演示在本地(即在您的计算机上&#x…

Android 粒子喷泉动效

一、前言: 在学习open gl es实现动效的时候,打算回顾了一下用普通的2D坐标系实现粒子效果和 open gl 3d 坐标系的区别,以及难易程度,因此本篇以Canvas 2D坐标系实现了一个简单的demo。 粒子动效原理: 粒子动效本质上…

504. Base 7(七进制数)

题目描述 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。 问题分析 按照二进制转换的方式进行转换即可 代码 char* convertToBase7(int num) {int count 0;char *x (char *)malloc(sizeof(char)*32);char *y (char *)malloc(sizeof(c…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)

【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底层实现(2.版本区别dictEntry & redisObject详解)-CSDN博客 紧接着前两篇的总体介绍,从这篇开始&#x…

windows安装sqlite

windows安装sqlite比linux麻烦很多 1.下载 下载链接:链接 下载dll的zip文件 2.解压并放到文件夹 将压缩包内的文件解压,放到C://sqlite下 3.编辑环境变量 添加到系统变量的path中 4.验证 打开命令提示符,输入 sqlite3有结果就行

JavaWeb02-MyBatis

目录 一、MyBatis 1.概述 2.JavaEE三层架构简单介绍 (1)表现层 (2)业务层 (3)持久层 3.框架 4.优势 (1)JDBC的劣势 (2)MyBatis优化 5.使用 &#…

Golang的for循环变量和goroutine的陷阱,1.22版本的更新

先来看一段golang 1.22版本之前的for循环的代码 package mainimport "fmt"func main() {done : make(chan bool)values : []string{"chen", "hai", "feng"}for _, v : range values {fmt.Println("start")go func() {fmt.P…