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 统计学习导 ...
随机推荐
- GPU简介
摘自:https://zhidao.baidu.com/question/1765722944085349980.html 其发起者和主导者是baiNVIDIA(英伟达)公司. 1999年,duNVI ...
- QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo
前言 使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车.无人船.无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇: 上半部分:主要是安装好后,使用QtC ...
- 分享一个Byte KB MB GB 单位转换方法 从《C#本质论第三版》
static public string FormatBytes(long bytes) { string[] magnitudes = new string[] { "GB", ...
- 开发中你不得不知的一个Git小技巧
一. 背景 在工作中大家应会碰到需要频繁在两个分支中切换工作的情况,我们通常做法是利用git stash命令暂存当前工作区中的变更,然后git checkout到目标分支中工作,工作完成后回到刚刚分支 ...
- Vue——生命周期
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 不到200行用Vue实现类似Swiper.js的轮播组件
前言 大家在开发过程中,或多或少都会用到轮播图之类的组件,PC和Mobile上使用 Swiper.js ,小程序上使用swiper组件等. 本文将详细讲解如何用Vue一步步实现的类似Swiper.js ...
- Ceph对象网关,多区域网关
目录 Ceph对象网关,多区域网关 1. 文件系统与对象存储的区别 1.1 对象存储使用场景 1.2 对象存储的接口标准 1.3 桶(bucket) 2. rgw 2.1 对象存储认证 2.2 对象网 ...
- 「C++」深度分析C++中i++与++i的区别
大家好,我是Charzie.在C++编程中,i++和++i是两个常见的自增运算符,用于将变量的值增加1(有时与i+=1效果一样).然而,虽然它们的功能看似相似,但在实际使用中却存在显著的区别.本博客将 ...
- ftp和tftp有什么区别
TFTP和FTP都是文件传输协议,但它们在很多方面存在明显的区别. 安全性:FTP协议使用的是明文传输,而TFTP协议使用的是UDP协议,没有使用TCP,所以不提供验证. 传输方式:FTP协议使用的是 ...
- java中实现创建目录、创建文件的操作
一.创建目录 mkdir()--仅创建一层目录,返回true或false. mkdirs()--创建一层或多层目录,返回true或false. 也就是,在通常情况下,使用mkdirs()即可满足创 ...