SMOGN演算法Python實現:解決迴歸分析中的資料不平衡

疯狂学习GIS發表於2024-06-03

  本文介紹基於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演算法解決不平衡資料的迴歸問題即可。

  至此,大功告成。

相關文章