SMOTE与SMOGN算法R语言代码
本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。
在之前的文章SMOGN算法Python实现:解决回归分析中的数据不平衡中,我们介绍了基于Python语言中的smogn包,实现SMOGN算法,对机器学习、深度学习回归中训练数据集不平衡的情况加以解决的具体方法;而我们也在上述这一篇文章中提到了,SMOGN算法的Python实现实在是太慢了,且Python还无法较为方便地实现回归数据的SMOTE算法。因此,我们就在本文中介绍一下基于R语言中的UBL包,实现SMOTE算法与SMOGN算法的方法。对于这两种算法的具体介绍与对比,大家参考上述提到的这一篇文章即可,这里就不再赘述了。
首先,我们配置一下所需用到的R语言UBL包。包的下载方法也非常简单,我们输入如下的代码即可。
install.packages("UBL")
输入代码后,按下回车键,运行代码;如下图所示。

接下来,我们即可开始代码的撰写。在这里,我们最好通过如下的方式新建一个R语言脚本(我这里是用的RStudio);因为后期执行算法的时候,我们往往需要对比多种不同的参数搭配效果,通过脚本来运行代码会比较方便。

其中,我们需要的代码如下所示。
library(UBL)
csv_path <- r"(E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\26_Train_Model_New\Train_Model_0710.csv)"
result_path <- r"(E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\26_Train_Model_New\Train_Model_0710_smote_nir.csv)"
data <- read.csv(csv_path)
data_nona <- na.omit(data)
data_nona$PointType <- as.factor(data_nona$PointType)
data_nona$days <- as.factor(data_nona$days)
data_smote <- SmoteRegress(inf_dif~., data_nona, dist = "HEOM", C.perc = "balance")
data_smogn <- SMOGNRegress(inf_dif~., data_nona, thr.rel = 0.6, dist = "HEOM", C.perc = "extreme")
hist(data_nona$inf_dif, breaks = 50)
hist(data_smote$inf_dif, breaks = 50)
hist(data_smogn$inf_dif, breaks = 50)
write.csv(data_smogn, file = result_path, row.names = FALSE)
write.csv(data_smote, file = result_path, row.names = FALSE)
其中,上述代码的具体含义如下。
首先,通过library(UBL)将我们刚刚配置好的UBL包加以加载,该包提供了处理不平衡数据的函数和算法;随后,我们可以设置输入的.csv格式文件的路径,这一文件中存储了我们需要加以处理的数据;随后,我们设置输出的.csv格式文件的路径,这一文件就是我们加以处理后的结果数据。
接下来,我们使用read.csv函数读取输入的.csv格式文件,并将其存储在变量data中。其后的data_nona <- na.omit(data)代码表示,去除数据中的缺失值,将处理后的数据保存在data_nona中。随后,这里需要注意,由于我们的输入数据中含有数值型的类别变量,因此需要将其转换为因子(factor)类型,这样才可以被UBL包识别为类别变量。
接下来,第一个函数SmoteRegress()就是使用SMOTE算法对data_nona进行回归任务的不平衡处理——其中inf_dif是目标变量(因变量),~.表示使用所有其他列作为特征(自变量),dist = "HEOM"表示使用HEOM(Heterogeneous Euclidean-Overlap Metric)距离度量(注意,只要我们的输入数据中有类别变量,那么就需要用这一种距离表示方式),最后的C.perc = "balance"表示平衡类别比例。
随后的SMOGNRegress()函数,则是使用SMOGN算法对 data_nona 进行回归任务的不平衡处理——其中thr.rel = 0.6表示设置相对阈值为0.6,这个参数设置的越大,算法执行的程度越深;其他参数则和前一个函数类似。这里如果大家需要对两个函数的参数加以更进一步的理解,可以直接访问其官方网站。
最后,为了比较一下我们执行SMOTE算法与SMOGN算法的结果,可以绘制一下data_nona中,目标变量inf_dif的直方图,breaks = 50表示将直方图分成50个条块。
如果通过直方图确定我们算法处理后的数据可以接受,那么就可以将处理结果数据写入到输出的.csv格式文件,row.names = FALSE表示不保存行索引。
执行上述代码后,我们可以实际看一下三个直方图的结果情况。首先,是处理前的数据,如下图所示。

其次,是SMOTE算法处理后的数据,如下图所示。

最后,是SMOGN算法处理后的数据,如下图所示。

基于以上图片可以很清楚地看出,SMOTE算法与SMOGN算法确实对于原始的数据分布而言,有着明显的改变作用。
至此,大功告成。
SMOTE与SMOGN算法R语言代码的更多相关文章
- 统计学习导论之R语言应用(三):线性回归R语言代码实战
统计学习导论(ISLR) 参考资料 The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导 ...
- 机器学习十大算法总览(含Python3.X和R语言代码)
引言 一监督学习 二无监督学习 三强化学习 四通用机器学习算法列表 线性回归Linear Regression 逻辑回归Logistic Regression 决策树Decision Tree 支持向 ...
- PageRank算法R语言实现
PageRank算法R语言实现 Google搜索,早已成为我每天必用的工具,无数次惊叹它搜索结果的准确性.同时,我也在做Google的SEO,推广自己的博客.经过几个月尝试,我的博客PR到2了,外链也 ...
- 数据挖掘算法R语言实现之决策树
数据挖掘算法R语言实现之决策树 最近,看到很多朋友问我如何用数据挖掘算法R语言实现之决策树,想要了解这方面的内容如下: > library("party")导入数据包 > ...
- R语言︱情感分析—基于监督算法R语言实现(二)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:本文大多内容来自未出版的<数据 ...
- DES加密解密算法C语言代码实现
代码: #include<stdio.h> #include<string.h> #include<stdlib.h> /*-------------------- ...
- GA算法-R语言实现
旅行商问题 北工商-经研143班共有30位同学,来自22个地区,我们希望在假期来一次说走就走的旅行,将所有同学的家乡走一遍.算起来,路费是一笔很大的花销,所以希望设计一个旅行方案,确保这一趟走下来的总 ...
- 一个简单文本分类任务-EM算法-R语言
一.问题介绍 概率分布模型中,有时只含有可观测变量,如单硬币投掷模型,对于每个测试样例,硬币最终是正面还是反面是可以观测的.而有时还含有不可观测变量,如三硬币投掷模型.问题这样描述,首先投掷硬币A,如 ...
- 模拟退火算法 R语言
0 引言 模拟退火算法是用来解决TSP问题被提出的,用于组合优化. 1 原理 一种通用的概率算法,用来在一个打的搜索空间内寻找命题的最优解.它的原理就是通过迭代更新当前值来得到最优解.模拟退火通常使用 ...
- 统计学习导论之R语言应用(二):R语言基础
统计学习导论(ISLR) 参考资料 The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导 ...
随机推荐
- 【论文阅读】VulCNN受图像启发的可扩展漏洞检测系统
基本信息 摘要 由于深度学习(DL)可以自动从源代码中学习特征,因此已被广泛用于源代码漏洞检测.为了实现可扩展的漏洞扫描,一些先前的研究打算通过将源代码视为文本来直接处理源代码.为了实现准确的漏洞检测 ...
- Linux搭建ES集群环境
搭建ES集群环境 准备 三台服务器 其中一台为主机节点 ES安装自行上传到各个节点home路径下并解压重命名 集群名称:cluster-big-data同一个集群多个节点,集群名称必须相同,节点名称不 ...
- 关于sass(scss)、less、postcss、stylus的简介与区别
为什么会出现css预处理器 CSS不是一种编程语言,仅仅只能用来编写网站样式,在web初期时,网站的搭建还比较基础,所需要的样式往往也很简单.但是随着用户需求的增加以及网站技术的升级,css一成不 ...
- 平衡树 Treap & Splay [学习笔记]
平衡树 \(\tt{Treap}\) & \(\tt{Splay}\) 壹.单旋 \(\tt{Treap}\) 首先了解 \(\tt{BST}\) 非常好用的东西,但是数据可以把它卡成一条链 ...
- 史上最全shell脚本编程语法上册
1. shell 脚本语言的基本用法 1.1 shell 脚本的用途 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率: 减少手工命令的输入,一定程度上避免人为错误: 将软件或应用的安装及 ...
- Linux进程Fork详解
一. fork函数详解 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- 解密Prompt系列30. LLM Agent之互联网冲浪智能体
这一章我们介绍能自主浏览操作网页的WebAgent们和相关的评估数据集,包含初级任务MiniWoB++,高级任务MIND2WEB,可交互任务WEBARENA,多模态WebVoyager,多轮对话Web ...
- Python爬图片(面向对象版)
import requests from lxml import etree from threading import Thread class Spider(object): def __init ...
- uniapp 跳转tabbar页面传递参数
我们这里采用的是本地缓存的方式进行页面的传参 首先看下官方有关本地缓存的介绍 1.设置本地缓存(-- uni.setStorageSync(KEY,DATA) --) 参数 类型 必填 说明 key ...
- 8个实用的Java Streams API
分享8个开箱即用的API,方便日常处理集合. 1. 快速过滤空值:Stream.ofNullable 该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常. 在 ...