特征工程:数据平衡

目录


一、前言

二、正文

Ⅰ.基于过采样算法

Ⅱ.基于欠采样算法

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

三、结语


一、前言

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

二、正文

  

Ⅰ.基于过采样算法

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()

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

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

三、结语

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

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

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

相关文章

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的&#xff0c;其实直接输出就可以了&#xff0c;输出 Hello 2024&#xff0c;注意&#xff0c;中间有一个空格&#xff01; T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …

机器学习---学习与推断,近似推断、话题模型

1. 学习与推断 基于概率图模型定义的分布&#xff0c;能对目标变量的边际分布&#xff08;marginal distribution&#xff09;或某些可观测变量 为条件的条件分布进行推断。对概率图模型&#xff0c;还需确定具体分布的参数&#xff0c;称为参数估计或学习问 题&#xff0c;…

MATLAB环境下一维时间序列信号的同步压缩小波包变换

时频分析相较于目前的时域、频域信号处理方法在分析时变信号方面&#xff0c;其主要优势在于可以同时提供时域和频域等多域信号信息&#xff0c;并清晰的刻画了频率随时间的变化规律&#xff0c;已被广泛用于医学工程、地震、雷达、生物及机械等领域。 线性时频分析方法是将信…

第十七篇【传奇开心果系列】Python的OpenCV库技术点案例示例:自适应阈值二值化处理图像提取文字

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、自适应阈值二值化处理图像提取文字轮廓的初步示例代码:二、扩展思路介绍三、调整自适应阈值二值化的参数示例代码四、对二值化图像进行形态学操作示例代码五、使用轮廓特征进行筛选示…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)

八、ui窗体创建要点 .h文件定义(popwindowf.h)&#xff0c; TEST_TYPE_WINDOW宏是要创建的窗口样式。 #pragma once #include <gtk/gtk.h> G_BEGIN_DECLS #define TEST_TYPE_WINDOW (test_window_get_type()) G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WI…

java缓冲流

缓冲流相比较基本流效率更高&#xff0c;因为自带长度的8192缓冲区 缓冲流在io体系中的的位置&#xff1a; 字节缓冲流&#xff1a; 缓冲流的构造方法&#xff1a;输入、输出 **先通过一个练习了解字节缓冲流两个写法&#xff1a; //创建缓冲流对象 BufferedInputStream bis…

零基础学编程怎么入手,中文编程工具构件箱之渐变背景构件用法教程,系统化的编程视频教程上线

零基础学编程怎么入手&#xff0c;中文编程工具构件箱之渐变背景构件用法教程&#xff0c;系统化的编程视频教程上线 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例…

跟着cherno手搓游戏引擎【22】CameraController、Resize

前置&#xff1a; YOTO.h: #pragma once//用于YOTO APP#include "YOTO/Application.h" #include"YOTO/Layer.h" #include "YOTO/Log.h"#include"YOTO/Core/Timestep.h"#include"YOTO/Input.h" #include"YOTO/KeyCod…

070:vue+cesium: 利用canvas设置线性渐变色材质

第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共104行)专栏目标示例效果 配置方式 1)查看基础…

每日五道java面试题之java基础篇(三)

第一题. switch 是否能作⽤在 byte/long/String 上&#xff1f; Java5 以前 switch(expr)中&#xff0c;expr 只能是 byte、short、char、int。从 Java 5 开始&#xff0c;Java 中引⼊了枚举类型&#xff0c; expr 也可以是 enum 类型。从 Java 7 开始&#xff0c;expr 还可以…

504. Base 7(七进制数)

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

HCIA--NAT实验

1. 划分网段&#xff0c;配置接口IP地址&#xff0c;内网启用OSPF协议&#xff0c;并配置一对一的NAT&#xff1a; AR1配置&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 10.1.1.1 24 [Huawei-GigabitEthernet0/0/0]int g0/0/1 [Huawei-GigabitEther…

Kafka 入门介绍

目录 一. 前言 二. 使用场景 三. 分布式的流平台 四. Kafka 的基本术语 4.1. 主题和日志 &#xff08;Topic 和 Log&#xff09; 4.2. 分布式&#xff08;Distribution&#xff09; 4.3. 异地数据同步技术&#xff08;Geo-Replication&#xff09; 4.4. 生产者&#xf…

svg 进阶

svg 进阶 svg 应用场景 绘制 icon绘制动画 svg viewport 和 viewBox viewport 是 svg 图像的可见区域 viewBox 是用于在画布上绘制 svg 图形的坐标系统 在一下案例中 svg中 width“500” height“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20 那么他…

python-游戏篇-初级-超级画板

文章目录 开发环境要求运行方法PyCharmVScode 代码main.pytools.py 效果 开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统&#xff1a;Windows 7、Windows 10。Python版本&#xff1a;Python 3.7.1。开发工具&#xff1a;PyCharm 2018。Python内置模块&#xff…

redis-sentinel(哨兵模式)

目录 1、哨兵简介:Redis Sentinel 2、作用 3、工作模式 4、主观下线和客观下线 5、配置哨兵模式 希望能够帮助到大家&#xff01;&#xff01;&#xff01; 1、哨兵简介:Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具&#xff0c;其已经被集成在re…

【Maven】依赖、构建管理 继承与聚合 快速学习(3.6.3 )

文章目录 Maven是什么&#xff1f;一、Maven安装和配置本地配置文件设置idea配置本地maven 二、基于IDEA的Maven工程创建2.1 Maven工程GAVP属性2.2 Idea构建Maven JavaEE工程 三、Maven工程项目结构说明四、Maven核心功能依赖和构建管理4.1 依赖管理和配置4.2 依赖传递和冲突4.…

Python环境下基于最大离散重叠小波变换和支持向量回归的金融时间序列预测

金融时间序列具有非线性、高频性、随机性等特点&#xff0c;其波动情况不仅与当前股票市场、房地产市场、贸易市场等有强联动性&#xff0c;而且大幅度起伏对于其他市场有较大的影响和冲击。由于金融市场受多种因素影响且各影响因素间也存在一定复杂动态交互关系&#xff0c;导…

css的布局(BFC)

一、css中常规的定位方案 1、普通流 元素按照其在HTML中的先后位置自上而下布局。 行内元素水平排列&#xff0c;当行被占满后换行&#xff1b;块级元素则会被渲染为完整的一行。 所有元素默认都是普通流定位。 2、浮动 元素首先按照普通流的位置出现&#xff0c; 然后根据浮动…

Eclipse安装配置、卸载教程(Windows版)

Eclipse是一个开放源代码的集成开发环境&#xff08;IDE&#xff09;&#xff0c;最初由IBM公司开发&#xff0c;现在由Eclipse基金会负责维护。它是一个跨平台的工具&#xff0c;可以用于开发多种编程语言&#xff0c;如Java、C/C、Python、PHP、Rust等。 Eclipse提供了一个可…