用R處理不平衡的資料

2021-08-20 17:36:50 字數 2665 閱讀 9110

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

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

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

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

本文概要

- 對資料集進行探索性分析

1. 檢查非平衡資料

2. 檢查每小時的交易筆數

3. 檢查pca變數的均值

- 資料切分

- 在訓練集上訓練模型

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

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

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

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

library(dplyr)

creditcard_details$class

creditcarddf % group_by(class) %>% summarize(class_count = n())

print(head(creditcarddf))

# a tibble: 2 x 2

class class_count

1028431521

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鏈結。

問答如何從源安裝r語言包?

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

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

用r解析mahout使用者推薦協同過濾演算法(usercf)

用R處理不平衡的資料

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

不平衡資料處理

在做實驗中遇到了非平衡資料集,導致實驗結果很憂傷,資料類別不均對模型訓練有挺大影響,尤其是在類別極度不均的時候。目前還沒有很好的解決方法,還處於查詢資料,比著葫蘆找葫蘆的過程中,記錄一下,或許能有所啟發。對於不平衡資料,其實類別精度 precise 和召回率 recall 或者是準確率 accura...

類別不平衡資料的處理

1.不平衡學習的基本概念及處理方法分類 重點學習 分類中解決類別不平衡問題 綜述重點 2.學習adacost對adaboost的改進方式 實現基於代價敏感的adacost演算法 3.smote演算法的matlab實現 基於matlab,應用smote演算法對小樣本類進行過取樣 python中可以呼叫...