用R處理不平衡的數據

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~git

本文來自雲+社區翻譯社,做者ArrayZoneYourgithub

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

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

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

數據集介紹

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

數據列

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

img

本文概要函數

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

對數據集進行探索性分析

下面讓咱們使用R來對數據集進行彙總並對其中的關鍵、顯著的特徵進行可視化。性能

檢查非平衡數據

經過下面的操做咱們能夠看到應變量的不平衡性:測試

咱們能夠藉助dplyr包中的group_by函數對Class的值進行分組:ui

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),第一時間獲取更多海量技術實踐乾貨哦~

相關文章
相關標籤/搜索