歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~git
本文來自雲+社區翻譯社,做者ArrayZoneYourgithub
在分類問題當中,數據不平衡是指樣本中某一類的樣本數遠大於其餘的類別樣本數。相比於多分類問題,樣本不平衡的問題在二分類問題中的出現頻率更高。舉例來講,在銀行或者金融的數據中,絕大多數信用卡的狀態是正常的,只有少數的信用卡存在盜刷等異常現象。算法
使用算法不能得到非平衡數據集中足以對少數類別作出準確預測所需的信息。因此建議使用平衡的分類數據集進行訓練。bootstrap
在本文中,咱們將討論如何使用R來解決不平衡分類問題。bash
本文使用的數據集爲信用卡交易數據集,總的交易信息量爲284K條,共有31個信息列,其中包含492次信用卡盜刷(詐騙)信息。微信
本文概要函數
下面讓咱們使用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
能夠看到每一個類別數據所佔的比例:
要按填或者小時查看交易筆數,咱們須要首先將日期標準化,而且根據天天的時間將一天劃分爲四等份。
上圖展現了兩天的交易信息在各個時間段的分佈狀況。對比能夠看到大部分的盜刷交易發生在13-18點。
爲了發現數據異常,咱們計算了V1-V28變量的均值並檢查了每一個變量的方差。從下圖能夠看到異常的交易數據(藍點)具備更大的方差。
在預測問題的建模當中,數據須要被切分爲訓練集(佔數據集的80%)和測試集(佔數據集的20%)。在數據切分以後,咱們須要進行特徵縮放來標準化自變量的範圍。
在訓練集上構建模型能夠分爲如下幾步:
經過混淆矩陣咱們能夠獲得模型在測試集上的準確率達到了99.9%,固然這是因爲樣本不均衡形成的。因此如今讓咱們忽略經過混淆矩陣獲得的模型準確率。經過ROC曲線,咱們獲得在測試集上的準確率爲78%,這比以前的99.9%要低得多。
下面咱們將使用不一樣的抽樣方法來平衡給定的數據集,而後檢查抽樣後的數據集中正常和異常數據的條數,最終在平衡數據集上構建模型。
在處理以前,異常的記錄有394條,正常的記錄有227K條。
在R中,ROSE和DMwR包能夠幫助咱們快速執行本身的採樣策略。ROSE包基於採樣方法和平滑的bootstrap方法來生成數據,它提供了良好的調用接口以幫助咱們迅速完成任務。
它支持如下采樣方法:
經過該方法可讓算法執行過採樣。因爲原始的數據集有227K條記錄,該方法會對持續對樣本量少的類別進行採樣直至其數據量達到227K。此時數據集樣本的總量將達到454K。該方法能夠經過指定參數method="over"
實現。
這個方法與過採樣方法類似,最終得到的數據集中正常記錄和異常記錄的數量也是相同的,不過欠採樣是無放回的抽樣,相應地在本文中的數據集上,因爲異常記錄過少,進行欠採樣以後咱們不能提取出樣本中的關鍵信息。該方法能夠經過指定參數method="under"
實現。
這個方法是過採樣和欠採樣的結合。多數類使用的是無放回的欠採樣,少數類使用的是又放回的過採樣。該方法能夠經過指定參數method="both"
實現。
ROSE抽樣方法利用合成的方法來生成數據,能夠提供原始數據更好的估計。
此方法能夠避免重複添加少數類樣本至主數據集時可能發生的過擬合現象。舉例來講,咱們過採樣以後一次獲取的數據可能只是少數類數據的一個子集。在瞭解了這些方法以後,咱們分別將這些方法應用到了原始數據集之上,以後統計的兩類樣本數以下:
用獲得的平衡訓練數據集再次對分類模型進行訓練,在測試數據上進行預測。因爲原始數據集是不平衡的,因此這裏咱們再也不使用混淆矩陣計算獲得的準確率做爲模型評價指標,取而代之的是roc.curve
捕得到到的roc
。
在本文的實驗中,使用SMOTE採樣方法獲得的數據訓練的模型性能最優。因爲這些採樣方法的variation不大,當它們與像隨機森林這樣魯棒性很強的算法結合使用時能夠獲得很是高的數據準確率。
在處理不平衡的數據集時,使用上面的全部採樣方法在數據集中進行試驗能夠得到最適合數據集的採樣方法。爲了得到更好的結果,還可使用一些先進的採樣方法(如本文中提到的合成採樣(SMOTE))進行試驗。
這些採樣方法在Python中也能夠很輕鬆地實現,若是想要參閱完整的代碼,能夠查閱下面提供的Github連接。
問答
相關閱讀
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1142201?fromSource=waitui
歡迎你們前往騰訊雲+社區或關注雲加社區微信公衆號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~