本文介紹基於R語言中的UBL包,讀取.csv格式的Excel表格文件,實現SMOTE演算法與SMOGN演算法,對機器學習、深度學習回歸中,訓練數據集不平衡的情況加以解決的具體方法~ ...
本文介紹基於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演算法確實對於原始的數據分佈而言,有著明顯的改變作用。
至此,大功告成。