鳗鱼家的萌宝 發表於 2024-7-15 13:42:00

SMOTE与SMOGN算法R语言代码

<p>  本文介绍基于<strong>R</strong>语言中的<code>UBL</code>包,读取<code>.csv</code>格式的<strong>Excel</strong>表格文件,实现<strong>SMOTE</strong>算法与<strong>SMOGN</strong>算法,对机器学习、深度学习回归中,<strong>训练数据集不平衡</strong>的情况加以解决的具体方法。</p>
<p>  在之前的文章SMOGN算法Python实现:解决回归分析中的数据不平衡中,我们介绍了基于<strong>Python</strong>语言中的<code>smogn</code>包,实现<strong>SMOGN</strong>算法,对机器学习、深度学习回归中<strong>训练数据集不平衡</strong>的情况加以解决的具体方法;而我们也在上述这一篇文章中提到了,<strong>SMOGN</strong>算法的<strong>Python</strong>实现实在是太慢了,且<strong>Python</strong>还无法较为方便地实现回归数据的<strong>SMOTE</strong>算法。因此,我们就在本文中介绍一下基于<strong>R</strong>语言中的<code>UBL</code>包,实现<strong>SMOTE</strong>算法与<strong>SMOGN</strong>算法的方法。对于这两种算法的具体介绍与对比,大家参考上述提到的这一篇文章即可,这里就不再赘述了。</p>
<p>  首先,我们配置一下所需用到的<strong>R</strong>语言<code>UBL</code>包。包的下载方法也非常简单,我们输入如下的代码即可。</p>
<pre><code class="language-R">install.packages("UBL")
</code></pre>
<p>  输入代码后,按下<code>回车</code>键,运行代码;如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240715134126728-1984637744.png"></p>
<p>  接下来,我们即可开始代码的撰写。在这里,我们最好通过如下的方式新建一个<strong>R</strong>语言脚本(我这里是用的<strong>RStudio</strong>);因为后期执行算法的时候,我们往往需要对比多种不同的参数搭配效果,通过脚本来运行代码会比较方便。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240715134120132-1252219337.png"></p>
<p>  其中,我们需要的代码如下所示。</p>
<pre><code class="language-R">library(UBL)
csv_path &lt;- r"(E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\26_Train_Model_New\Train_Model_0710.csv)"
result_path &lt;- r"(E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\26_Train_Model_New\Train_Model_0710_smote_nir.csv)"
data &lt;- read.csv(csv_path)
data_nona &lt;- na.omit(data)
data_nona$PointType &lt;- as.factor(data_nona$PointType)
data_nona$days &lt;- as.factor(data_nona$days)

data_smote &lt;- SmoteRegress(inf_dif~., data_nona, dist = "HEOM", C.perc = "balance")
data_smogn &lt;- 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)
</code></pre>
<p>  其中,上述代码的具体含义如下。</p>
<p>  首先,通过<code>library(UBL)</code>将我们刚刚配置好的<code>UBL</code>包加以加载,该包提供了处理不平衡数据的函数和算法;随后,我们可以设置输入的<code>.csv</code>格式文件的路径,这一文件中存储了我们需要加以处理的数据;随后,我们设置输出的<code>.csv</code>格式文件的路径,这一文件就是我们加以处理后的结果数据。</p>
<p>  接下来,我们使用<code>read.csv</code>函数读取输入的<code>.csv</code>格式文件,并将其存储在变量<code>data</code>中。其后的<code>data_nona &lt;- na.omit(data)</code>代码表示,去除数据中的缺失值,将处理后的数据保存在<code>data_nona</code>中。随后,这里需要注意,由于我们的输入数据中含有<strong>数值型的类别变量</strong>,因此需要将其转换为因子(<strong>factor</strong>)类型,这样才可以被<code>UBL</code>包识别为类别变量。</p>
<p>  接下来,第一个函数<code>SmoteRegress()</code>就是使用<strong>SMOTE</strong>算法对<code>data_nona</code>进行回归任务的不平衡处理——其中<code>inf_dif</code>是目标变量(因变量),<code>~.</code>表示使用所有其他列作为特征(自变量),<code>dist = "HEOM"</code>表示使用<strong>HEOM</strong>(Heterogeneous Euclidean-Overlap Metric)距离度量(注意,只要我们的输入数据中有类别变量,那么就需要用这一种距离表示方式),最后的<code>C.perc = "balance"</code>表示平衡类别比例。</p>
<p>  随后的<code>SMOGNRegress()</code>函数,则是使用<strong>SMOGN</strong>算法对 <code>data_nona</code> 进行回归任务的不平衡处理——其中<code>thr.rel = 0.6</code>表示设置相对阈值为<code>0.6</code>,这个参数设置的越大,算法执行的程度越深;其他参数则和前一个函数类似。这里如果大家需要对两个函数的参数加以更进一步的理解,可以直接访问其官方网站。</p>
<p>  最后,为了比较一下我们执行<strong>SMOTE</strong>算法与<strong>SMOGN</strong>算法的结果,可以绘制一下<code>data_nona</code>中,目标变量<code>inf_dif</code>的直方图,<code>breaks = 50</code>表示将直方图分成<code>50</code>个条块。</p>
<p>  如果通过直方图确定我们算法处理后的数据可以接受,那么就可以将处理结果数据写入到输出的<code>.csv</code>格式文件,<code>row.names = FALSE</code>表示不保存行索引。</p>
<p>  执行上述代码后,我们可以实际看一下三个直方图的结果情况。首先,是处理前的数据,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240715134120312-2025545084.png"></p>
<p>  其次,是<strong>SMOTE</strong>算法处理后的数据,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240715134120318-515479588.png"></p>
<p>  最后,是<strong>SMOGN</strong>算法处理后的数据,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240715134120121-1291842131.png"></p>
<p>  基于以上图片可以很清楚地看出,<strong>SMOTE</strong>算法与<strong>SMOGN</strong>算法确实对于原始的数据分布而言,有着明显的改变作用。</p>
<p>  至此,大功告成。</p><br><br>
来源:https://www.cnblogs.com/fkxxgis/p/18302987
頁: [1]
查看完整版本: SMOTE与SMOGN算法R语言代码