首页 > 编程语言 >SMOGN算法Python实现:解决回归分析中的数据不平衡

SMOGN算法Python实现:解决回归分析中的数据不平衡

时间:2024-06-03 13:59:29浏览次数:29  
标签:smogn SMOTE Python 样本 SMOGN 算法

  本文介绍基于Python语言中的smogn包,读取.csv格式的Excel表格文件,实现SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。

  在不平衡回归问题中,样本数量的不均衡性可能导致模型在预测较少类别的样本时表现较差;为了解决这个问题,可以使用SMOTE(Synthetic Minority Over-sampling Technique)算法或SMOGN(Synthetic Minority Over-Sampling Technique for Regression with Gaussian Noise)算法来生成合成样本来平衡数据集。

  SMOTE算法的基本思想是通过对少数类样本进行插值,生成一些合成样本,从而增加少数类样本的数量;这些合成样本是通过选取少数类样本和它们的近邻样本之间的差异来生成的。而SMOGN算法则是对SMOTE算法的进一步完善,在生成新样本的同时,还增加了高斯噪声,且在生成新样本(过采样)的同时还可以将原本数量较多的大样本减少(欠采样);因此,SMOGN算法相较SMOTE算法更为合理一些。

  在Python中,我们可以基于现有的第三方库smogn包,来完成SMOGN算法;而SMOTE算法则实现起来较为麻烦一些,还要自己写函数(imblearn.over_sampling.SMOTE虽然可以实现SMOTE算法,但其只适用于分类场景,在回归场景中无法使用);再加上既然SMOGN算法相较SMOTE算法更为合理一些,所以我们这里就只介绍SMOGN算法的Python实现。如果需要在R语言中实现这两种算法,大家参考文章R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题即可。

  首先,我们需要配置需要的smogn包。此时,我们需要打开Anaconda Prompt软件;这一软件的具体位置如下图所示。

image

  由于我希望在一个名称为py38Python虚拟环境中配置、使用smogn包,因此首先通过如下的代码进入这一虚拟环境;关于虚拟环境的创建与进入,大家可以参考文章创建Anaconda虚拟Python环境的方法

activate py38

  运行上述代码,即可进入指定的虚拟环境中。随后,我们输入如下的代码。

pip install smogn

  接下来,输入y即可开始smogn包的配置工作。再稍等片刻,出现如下图所示的情况,即说明smogn包已经配置完毕。

  接下来,我们通过如下的代码,即可实现对不平衡数据的SMOGN算法操作。

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 11 13:56:36 2023

@author: fkxxgis
"""

import smogn
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(r"E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\26_Train_Model_New\Train_Model_0711.csv")
df_nona = df.dropna()

df_smogn = smogn.smoter(
    data = df_nona,
    y = "inf_dif",
    k = 3)

plt.hist(df_nona["inf_dif"], bins = 50)
plt.hist(df_smogn["inf_dif"], bins = 50)

  代码的整体思路也很简单,首先就是读取一下.csv格式的Excel表格文件,随后基于smogn.smoter()函数进行SMOGN算法的实现;其中,上述代码用到了3个参数,第一个参数表示需要加以处理的全部数据,第二个参数则表示我们的因变量,第三个参数是在进行过采样时,判断样本距离所用到的邻域个数。关于这个函数详细的参数介绍,大家可以参考其官方网站;我们这里就不再赘述了。代码最后,就是绘制2个直方图,看看我们的SMOGN算法效果。

  运行上述代码,即可开始SMOGN算法的实现。在运行时,将会看到如下所示的进度条。不过不得不说,在数据量比较大的时候,程序运行真的会很慢很慢。

  如下图所示,我们一共要完成6个进度条,才算完成全部的SMOGN算法。

  接下来,我们可以对比一下直方图。如下图所示,是我们执行SMOGN算法前的因变量直方图。

  下图则是执行SMOGN算法后的因变量直方图。

  可以看到,只能说效果一般,其中数据的少数部分,稍微有些增多;而数据原本的主要部分,甚至也被增多了。当然,这和我们前面smogn.smoter()函数的参数设置是有关的,大家如果希望进一步调整SMOGN算法的效果,可以自行尝试修改smogn.smoter()函数的参数。

  我这里就没有花更多时间对参数加以修改了——因为通过这样的方法完成SMOGN算法的Python实现,实在是太慢了;不如用R语言来实现,速度非常快,且效果也非常好,另外其还可以同时实现SMOGN算法与SMOTE算法。具体在R语言中的实现方法,大家参考文章R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题即可。

  至此,大功告成。

标签:smogn,SMOTE,Python,样本,SMOGN,算法
From: https://www.cnblogs.com/fkxxgis/p/18228753

相关文章

  • Python群发邮件的功能如何实现?怎么使用?
    Python群发邮件需要哪些库支持?如何使用Python发信?对于Python开发者来说,实现群发邮件功能是一项非常有用的技能,无论是用于营销、通知还是其他目的。AokSend将介绍如何使用Python来实现群发邮件的功能,让你轻松管理大量邮件发送。Python群发邮件:安装软件要实现群发邮件功能,我......
  • 《Python进阶》学习笔记
    《Python进阶》学习笔记部分原创,仅个人关于《Python进阶》的学习笔记importwarnings#忽略警告warnings.filterwarnings("ignore")*args的用法deftest_args(f_arg,*argv):print("第一个参数是:",f_arg)forarginargv:print("其他argv参数是:",arg)......
  • C语言Prim算法和Prim-Alternat找最小生成树
    文章目录1、用prim算法求最小生成树C语言Prim算法实现2、用Prim-Alternate算法求最小生成树3、C语言Prim-Alternate算法实现1、用prim算法求最小生成树绿色线会标记选过的边从v1当作起始点开始,可选择:(v1,v2)权值为6(v1,v3)权值为3(v1,v4)权值为1从中选择边(v1,v......
  • AI大模型探索之路-实战篇14: 集成本地Python代码解释器:强化Agent智能数据分析平台
    系列篇章......
  • 如何用Python语言实现远程控制电源开关
    如何用Python语言实现远程控制电源开关呢?本文描述了使用Python语言调用HTTP接口,实现控制电源开关,通过控制电源开关,从而控制电器设备。可选用产品:可根据实际场景需求,选择对应的规格序号设备名称厂商1智能WiFi墙壁插座10A统软云物联2智能WiFi墙壁插座16A3智能WiFi插座10A4智能......
  • python 探测网络 并自动绘制ip拓扑图
    要实现网络探测并自动绘制IP拓扑图,你可以使用Python与相关库和工具来完成。一个流行的方法是使用Python的网络扫描库(例如Nmap或Scapy)来扫描网络,并使用网络图形库(例如NetworkX和Matplotlib)来绘制IP拓扑图。以下是一个粗略的步骤示例,展示了如何实现网络探测并自动绘制IP拓扑图:i......
  • python NetworkX和Matplotlib 来绘制IP拓扑图
    要使用NetworkX和Matplotlib来绘制IP拓扑图,首先需要使用NetworkX来构建图形,并在图形准备就绪后,使用Matplotlib绘制图形。以下是一个简单的示例,演示了如何使用NetworkX和Matplotlib来绘制IP拓扑图:importnetworkxasnximportmatplotlib.pyplotasplt#创建一个简单的示......
  • Python学习笔记(一)
    PS:这篇文章是以一个学习者的角度来汇总知识点以及教程,对于想学习Python的入门者也会比较友好,想学习python可以先收藏,我会慢慢持续更新。学艺不精,如有纰漏,敬请指正。需要安装配置python和Pycharm软件可以移步这篇文章,有详细的教程。传送门:python及pycharm安装配置-CSDN博客P......
  • python数据分析——数据预处理
    数据预处理前言一、查看数据数据表的基本信息查看info()示例查看数据表的大小shape()示例数据格式的查看type()dtype()dtypes()示例一示例二查看具体的数据分布describe()示例二、缺失值处理缺失值检查isnull()示例缺失值删除dropna()示例一示例二缺失值替换/填充fillna()inte......
  • 代码随想录算法训练营Day59 | 503.下一个更大元素II、42. 接雨水 | Python | 个人记录
    注:Day58是休息日。本文目录503.下一个更大元素II做题看文章42.接雨水做题看文章以往忽略的知识点小结个人体会503.下一个更大元素II代码随想录:503.下一个更大元素IILeetcode:503.下一个更大元素II做题和之前的739.每日温度一样,只不过可以循环,我这边是多遍历一......