信用卡詐騙偵測的重要性
信用卡詐騙偵測是所有金融機構面臨的一個大問題。一般來說,偵測詐騙非常具有挑戰性,因為詐騙者不斷想出新的方法來進行詐騙,所以很難找到可以偵測的模式。舉例來說,在下面的圖示中,所有的圖標看起來都一樣,但有一個圖標與其他的稍有不同,我們需要找出來。你能找到它嗎?
這裡就是那個不同的圖標:
今天的學習計畫
接下來,我們將討論與「信用卡詐騙偵測」相關的幾個主題:
- 什麼是數據不平衡
- 數據不平衡的可能原因
- 為什麼類別不平衡在機器學習中是一個問題
- 隨機森林演算法的簡單回顧
- 處理數據不平衡的不同抽樣方法
- 比較哪些方法在我們的情境中效果較好,並用Python做實際示範
- 選擇模型的商業見解及原因
在大多數情況下,由於詐騙交易的數量並不多,我們通常會面對一個包含大量非詐騙交易的數據集。從技術上來說,這樣的數據集被稱為「不平衡數據」。但是,偵測詐騙案例仍然非常重要,因為即使只有一筆詐騙交易,也可能導致銀行或金融機構損失數百萬。現在,讓我們更深入地了解什麼是數據不平衡。
我們將考慮來自 Kaggle 的信用卡詐騙數據集(開放數據許可)。
正式來說,這意味著不同類別之間的樣本分佈是不均等的。在我們的二元分類問題中,有兩個類別:
- 主要類別——非詐騙/真實交易
- 次要類別——詐騙交易
在考慮的數據集中,類別分佈如下(表1):
如我們所見,該數據集高度不平衡,只有0.17%的觀察結果屬於詐騙類別。
數據不平衡的主要原因有兩個:
- 偏倚抽樣/測量錯誤:這是因為只從一個類別或特定區域收集樣本,或者樣本被錯誤分類。這可以通過改善抽樣方法來解決。
- 用例/領域特徵:在我們的情況下,這可能是由於預測稀有事件的問題,這會自動導致對主要類別的偏倚,因為次要類別的出現頻率不高。
這是一個問題,因為大多數機器學習算法專注於從頻繁發生的事件中學習,即主要類別。這稱為頻率偏見。因此,在不平衡數據集的情況下,這些算法可能無法很好地工作。通常,樹基算法或異常檢測算法會比較有效。傳統上,在詐騙檢測問題中,通常使用基於業務規則的方法。樹基方法效果良好,因為樹會創建基於規則的層次結構來區分兩個類別。決策樹往往會過度擬合數據,為了消除這種可能性,我們將使用集成方法。今天,我們將使用隨機森林演算法。
隨機森林通過建立多個決策樹預測器來工作,這些個別決策樹的類別模式是最終選擇的類別或輸出。這就像為最受歡迎的類別投票。例如:如果兩棵樹預測規則1表示詐騙,而另一棵樹預測規則1表示非詐騙,那麼根據隨機森林演算法,最終預測將是詐騙。
正式定義:隨機森林是一個分類器,由一組樹狀結構的分類器組成 {h(x,Θk ), k=1, …},其中 {Θk} 是獨立同分佈的隨機向量,每棵樹對輸入 x 的最受歡迎類別投票。
每棵樹依賴於一個獨立抽樣的隨機向量,所有樹的分佈相似。隨著樹的數量增加,泛化誤差會收斂。在其分裂標準中,隨機森林會在隨機特徵子集之間尋找最佳特徵,我們還可以計算變量的重要性,並相應地進行特徵選擇。樹可以使用袋裝技術進行生長,觀察可以隨機選擇(不重複)自訓練集。另一種方法是隨機分裂選擇,在每個節點隨機選擇K個最佳分裂。
接下來,我們將介紹三種可以處理數據不平衡的抽樣方法。
- 隨機下抽樣:從非詐騙觀察中隨機抽取,即主要類別,以使其與詐騙觀察,即次要類別相匹配。這意味著我們正在丟棄一些數據集中的信息,這可能並不總是理想的。
- 隨機上抽樣:在這種情況下,我們做的是下抽樣的相反,即隨機複製次要類別,即詐騙觀察,以增加次要類別的數量,直到我們獲得平衡的數據集。可能的限制是我們使用此方法創建了很多重複。
- SMOTE(合成次要上抽樣技術):這是一種使用合成數據的方法,與K最近鄰(KNN)一起使用,而不是使用重複數據。每個次要類別示例及其k個最近鄰被考慮。然後在連接任何/所有次要類別示例和k個最近鄰之間的線段上創建合成示例。這在下面的圖3中說明:
僅使用上抽樣時,決策邊界變得更小,而使用SMOTE時,我們可以創建更大的決策區域,從而提高捕捉次要類別的機會。
一個可能的限制是,如果次要類別,即詐騙觀察在數據中分佈不均且不明顯,則使用最近鄰來創建更多詐騙案例會引入數據中的噪音,這可能導致錯誤分類。
一些評估模型表現的指標如下。這些指標提供了模型能夠多準確地預測/分類目標變量的視角:
· TP(真正例)/TN(真負例)是正確預測的案例,即將詐騙案例預測為詐騙(TP)和將非詐騙案例預測為非詐騙(TN)
· FP(假正例)是那些實際上是非詐騙但模型預測為詐騙的案例
· FN(假負例)是那些實際上是詐騙但模型預測為非詐騙的案例
精確度 = TP / (TP + FP):精確度衡量模型能多準確地捕捉詐騙,即在所有預測為詐騙的案例中,有多少實際上是詐騙。
召回率 = TP / (TP + FN):召回率衡量在所有實際詐騙案例中,模型能正確預測多少詐騙。這是一個重要的指標。
準確率 = (TP + TN) / (TP + FP + FN + TN):衡量多少主要類別和次要類別能被正確分類。
F-score = 2 * TP / (2 * TP + FP + FN) = 2 * 精確度 * 召回率 / (精確度 * 召回率);這是精確度和召回率之間的平衡。請注意,精確度和召回率是相互關聯的,因此F-score是達成兩者之間平衡的良好指標。
首先,我們將使用一些預設特徵來訓練隨機森林模型。請注意,為了簡化,我們在這裡不討論特徵選擇或交叉驗證的模型優化。之後,我們將使用下抽樣、上抽樣,然後是SMOTE來訓練模型。下面的表格顯示了每種方法的混淆矩陣以及精確度、召回率和準確率指標。
沒有抽樣結果解釋:在沒有任何抽樣的情況下,我們能夠捕捉到76筆詐騙交易。雖然整體準確率為97%,但召回率為75%。這意味著我們的模型無法捕捉到相當多的詐騙交易。
以下是可以使用的代碼:
# 訓練模型from sklearn.ensemble import RandomForestClassifierclassifier = RandomForestClassifier(n_estimators=10,criterion=’entropy’, random_state=0)classifier.fit(x_train,y_train)
# 在測試集上預測y_pred = classifier.predict(x_test)
# 從分類報告和混淆矩陣獲取結果from sklearn.metrics import classification_report, confusion_matrix
print(‘分類報告:\n’, classification_report(y_test, y_pred))conf_mat = confusion_matrix(y_true=y_test, y_pred=y_pred)print(‘混淆矩陣:\n’, conf_mat)
下抽樣結果解釋:使用下抽樣,雖然模型能夠捕捉到90筆詐騙案例,召回率有顯著改善,但準確率和精確度卻大幅下降。這是因為假正例大幅增加,模型對許多真實交易進行了懲罰。
下抽樣代碼片段:
# 我們需要的管道模組from imblearn.under_sampling import RandomUnderSamplerfrom imblearn.pipeline import Pipeline
# 定義在管道中使用的重抽樣方法和機器學習模型resampling = RandomUnderSampler()model = RandomForestClassifier(n_estimators=10,criterion=’entropy’, random_state=0)
# 定義管道,並將抽樣方法與RF模型結合pipeline = Pipeline([(‘RandomUnderSampler’, resampling), (‘RF’, model)])
pipeline.fit(x_train, y_train) predicted = pipeline.predict(x_test)
# 從分類報告和混淆矩陣獲取結果print(‘分類報告:\n’, classification_report(y_test, predicted))conf_mat = confusion_matrix(y_true=y_test, y_pred=predicted)print(‘混淆矩陣:\n’, conf_mat)
上抽樣結果解釋:上抽樣方法具有最高的精確度和準確率,召回率也很好,達到81%。我們能夠捕捉到6筆更多的詐騙案例,假正例也相對較低。總體來看,從所有參數的角度來看,這個模型是一個好模型。
上抽樣代碼片段:
# 我們需要的管道模組from imblearn.over_sampling import RandomOverSampler
# 定義在管道中使用的重抽樣方法和機器學習模型resampling = RandomOverSampler()model = RandomForestClassifier(n_estimators=10,criterion=’entropy’, random_state=0)
# 定義管道,並將抽樣方法與RF模型結合pipeline = Pipeline([(‘RandomOverSampler’, resampling), (‘RF’, model)])
pipeline.fit(x_train, y_train) predicted = pipeline.predict(x_test)
# 從分類報告和混淆矩陣獲取結果print(‘分類報告:\n’, classification_report(y_test, predicted))conf_mat = confusion_matrix(y_true=y_test, y_pred=predicted)print(‘混淆矩陣:\n’, conf_mat)
SMOTE:SMOTE進一步改善了上抽樣方法,捕捉到3筆更多的詐騙案例,雖然假正例略有增加,但召回率保持在84%。
SMOTE代碼片段:
# 我們需要的管道模組from imblearn.over_sampling import SMOTE
# 定義在管道中使用的重抽樣方法和機器學習模型resampling = SMOTE(sampling_strategy=’auto’,random_state=0)model = RandomForestClassifier(n_estimators=10,criterion=’entropy’, random_state=0)
# 定義管道,告訴它將SMOTE與RF模型結合pipeline = Pipeline([(‘SMOTE’, resampling), (‘RF’, model)])
pipeline.fit(x_train, y_train) predicted = pipeline.predict(x_test)
# 從分類報告和混淆矩陣獲取結果print(‘分類報告:\n’, classification_report(y_test, predicted))conf_mat = confusion_matrix(y_true=y_test, y_pred=predicted)print(‘混淆矩陣:\n’, conf_mat)
在我們的詐騙偵測用例中,最重要的指標是召回率。這是因為銀行和金融機構更關心捕捉到大多數詐騙案例,因為詐騙會造成高昂的成本,可能會損失很多錢。因此,即使有一些假正例,即將真實客戶標記為詐騙,這可能也不會太麻煩,因為這只是意味著阻止某些交易。然而,阻止過多的真實交易也不是一個可行的解決方案,因此根據金融機構的風險承受能力,我們可以選擇簡單的上抽樣方法或SMOTE。我們還可以調整模型的參數,以進一步提高模型的結果,使用網格搜索。
有關代碼的詳細信息,請參考此 GitHub 連結。
參考文獻:
[1] Mythili Krishnan, Madhan K. Srinivasan, 信用卡詐騙偵測:不同抽樣方法解決類別不平衡問題的探索 (2022),ResearchGate
[2] Bartosz Krawczyk, 從不平衡數據中學習:開放挑戰和未來方向 (2016),Springer
[3] Nitesh V. Chawla, Kevin W. Bowyer, Lawrence O. Hall 和 W. Philip Kegelmeyer, SMOTE:合成次要上抽樣技術 (2002),人工智慧研究期刊
[4] Leo Breiman, 隨機森林 (2001),stat.berkeley.edu
[5] Jeremy Jordan, 從不平衡數據中學習 (2018)
[6] https://trenton3983.github.io/files/projects/2019-07-19_fraud_detection_python/2019-07-19_fraud_detection_python.html
新聞來源
本文由 AI 台灣 使用 AI 編撰,內容僅供參考,請自行進行事實查核。加入 AI TAIWAN Google News,隨時掌握最新 AI 資訊!