用R處理不平衡的資料

騰訊雲加社群發表於2019-02-26

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文來自雲+社群翻譯社,作者ArrayZoneYour

在分類問題當中,資料不平衡是指樣本中某一類的樣本數遠大於其他的類別樣本數。相比於多分類問題,樣本不平衡的問題在二分類問題中的出現頻率更高。舉例來說,在銀行或者金融的資料中,絕大多數信用卡的狀態是正常的,只有少數的信用卡存在盜刷等異常現象。

使用演算法不能獲得非平衡資料集中足以對少數類別做出準確預測所需的資訊。所以建議使用平衡的分類資料集進行訓練。

在本文中,我們將討論如何使用R來解決不平衡分類問題。

資料集介紹

本文使用的資料集為信用卡交易資料集,總的交易資訊量為284K條,共有31個資訊列,其中包含492次信用卡盜刷(詐騙)資訊。

資料列

  • Time: 該筆交易距離資料集中第一筆交易的時間(按秒計)。
  • V1-V28:用PCA獲得的主成分變數。
  • Amount:交易金額。
  • Class:應變數,值為1代表該條記錄為盜刷記錄,否則為0
img

本文概要

  • 對資料集進行探索性分析
  1. 檢查非平衡資料
  2. 檢查每小時的交易筆數
  3. 檢查PCA變數的均值
  • 資料切分
  • 在訓練集上訓練模型
  • 使用抽樣的方法來構建平衡資料集

對資料集進行探索性分析

下面讓我們使用R來對資料集進行彙總並對其中的關鍵、顯著的特徵進行視覺化。

檢查非平衡資料

通過下面的操作我們可以看到應變數的不平衡性:

我們可以藉助dplyr包中的group_by函式對Class的值進行分組:

library(dplyr)
creditcard_details$Class <- as.factor(creditcard_details$Class)
creditcardDF <- creditcard_details %>% group_by(Class) %>% summarize(Class_count = n())
print(head(creditcardDF))
複製程式碼
# A tibble: 2 x 2
  Class Class_count
  <fct>       <int>
1 0          284315
2 1             492
複製程式碼

使用ggplot可以看到每個類別資料所佔的比例:

img

檢查每小時的交易筆數

要按填或者小時檢視交易筆數,我們需要首先將日期標準化,並且根據每天的時間將一天劃分為四等份。

img

上圖展示了兩天的交易資訊在各個時間段的分佈情況。對比可以看到大部分的盜刷交易發生在13-18點。

檢查PCA變數的均值

為了發現資料異常,我們計算了V1-V28變數的均值並檢查了每個變數的方差。從下圖可以看到異常的交易資料(藍點)具有更大的方差。

img

資料切分

在預測問題的建模當中,資料需要被切分為訓練集(佔資料集的80%)和測試集(佔資料集的20%)。在資料切分之後,我們需要進行特徵縮放來標準化自變數的範圍。

img

在訓練集上訓練模型

在訓練集上構建模型可以分為以下幾步:

  • 在訓練集上訓練分類器。
  • 在測試集上進行預測。
  • 檢測模型在非平衡資料上的預測輸出。

通過混淆矩陣我們可以得到模型在測試集上的準確率達到了99.9%,當然這是由於樣本不均衡造成的。所以現在讓我們忽略通過混淆矩陣得到的模型準確率。通過ROC曲線,我們得到在測試集上的準確率為78%,這比之前的99.9%要低得多。

img

使用抽樣的方法來構建平衡資料集

下面我們將使用不同的抽樣方法來平衡給定的資料集,然後檢查抽樣後的資料集中正常和異常資料的條數,最終在平衡資料集上構建模型。

img

在處理之前,異常的記錄有394條,正常的記錄有227K條。

在R中,ROSE和DMwR包可以幫助我們快速執行自己的取樣策略。ROSE包基於取樣方法和平滑的bootstrap方法來生成資料,它提供了良好的呼叫介面以幫助我們迅速完成任務。

它支援以下采樣方法:

過取樣(Oversampling)

通過該方法可以讓演算法執行過取樣。由於原始的資料集有227K條記錄,該方法會對持續對樣本量少的類別進行取樣直至其資料量達到227K。此時資料集樣本的總量將達到454K。該方法可以通過指定引數method="over"實現。

img

欠取樣(Undersampling)

這個方法與過取樣方法相似,最終獲得的資料集中正常記錄和異常記錄的數量也是相同的,不過欠取樣是無放回的抽樣,相應地在本文中的資料集上,由於異常記錄過少,進行欠取樣之後我們不能提取出樣本中的關鍵資訊。該方法可以通過指定引數method="under"實現。

img

Both Sampling

這個方法是過取樣和欠取樣的結合。多數類使用的是無放回的欠取樣,少數類使用的是又放回的過取樣。該方法可以通過指定引數method="both"實現。

ROSE Sampling

ROSE抽樣方法利用合成的方法來生成資料,可以提供原始資料更好的估計。

Synthetic Minority Over-Sampling Technique (SMOTE) Sampling

此方法可以避免重複新增少數類樣本至主資料集時可能發生的過擬合現象。舉例來說,我們過取樣之後一次獲取的資料可能只是少數類資料的一個子集。在瞭解了這些方法之後,我們分別將這些方法應用到了原始資料集之上,之後統計的兩類樣本數如下:

img

用得到的平衡訓練資料集再次對分類模型進行訓練,在測試資料上進行預測。由於原始資料集是不平衡的,所以這裡我們不再使用混淆矩陣計算得到的準確率作為模型評價指標,取而代之的是roc.curve捕獲得到的roc

aaaa

結論

在本文的實驗中,使用SMOTE取樣方法得到的資料訓練的模型效能最優。由於這些取樣方法的variation不大,當它們與像隨機森林這樣魯棒性很強的演算法結合使用時可以得到非常高的資料準確率。

在處理不平衡的資料集時,使用上面的所有采樣方法在資料集中進行試驗可以獲得最適合資料集的取樣方法。為了獲得更好的結果,還可以使用一些先進的取樣方法(如本文中提到的合成取樣(SMOTE))進行試驗。

這些取樣方法在Python中也可以很輕鬆地實現,如果想要參閱完整的程式碼,可以查閱下面提供的Github連結。

訓練資料集及程式碼


問答

如何從源安裝R語言包?

相關閱讀

用R語言進行文字挖掘和主題建模

協同過濾的R語言實現及改進

用R解析Mahout使用者推薦協同過濾演算法(UserCF)


此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1142201?fromSource=waitui

歡迎大家前往騰訊雲+社群或關注雲加社群微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~

相關文章