1. 程式人生 > >用R處理不平衡的數據

用R處理不平衡的數據

時間 pre chan 合數 r語言 協同過濾算法 cred 分析 一個

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

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

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

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

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

數據集介紹

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

數據列

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

技術分享圖片

本文概要

  • 對數據集進行探索性分析
  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可以看到每個類別數據所占的比例:

技術分享圖片

檢查每小時的交易筆數

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

技術分享圖片

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

檢查PCA變量的均值

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

技術分享圖片

數據切分

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

技術分享圖片

在訓練集上訓練模型

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

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

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

技術分享圖片

使用抽樣的方法來構建平衡數據集

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

技術分享圖片

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

在R中,ROSE和DMwR包可以幫助我們快速執行自己的采樣策略。ROSE包基於采樣方法和平滑的bootstrap方法來生成數據,它提供了良好的調用接口以幫助我們迅速完成任務。

它支持以下采樣方法:

過采樣(Oversampling)

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

技術分享圖片

欠采樣(Undersampling)

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

技術分享圖片

Both Sampling

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

ROSE Sampling

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

Synthetic Minority Over-Sampling Technique (SMOTE) Sampling

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

技術分享圖片

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

技術分享圖片

結論

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

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

這些采樣方法在Python中也可以很輕松地實現,如果想要參閱完整的代碼,可以查閱下面提供的Github鏈接。

訓練數據集及代碼

  • 訓練數據集
  • 本文的R、Python實現代碼

問答
如何從源安裝R語言包?
相關閱讀
用R語言進行文本挖掘和主題建模
協同過濾的R語言實現及改進
用R解析Mahout用戶推薦協同過濾算法(UserCF)

此文已由作者授權騰訊雲+社區發布,原文鏈接:https://cloud.tencent.com/developer/article/1142201?fromSource=waitui

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

用R處理不平衡的數據