基於決策樹和MLflow的大規模金融欺詐檢測
2019年5月2日 在公司博客上
無論用例如何,使用人工智能大規模檢測欺詐模式都是一個挑戰。大量的曆史數據需要篩選,不斷發展的機器學習和深度學習技術的複雜性,以及非常少的欺詐行為的實際例子,這些都相當於在不知道針長什麼樣的情況下,在幹草堆裏找到一根針。在金融服務行業,對安全性的額外關注以及解釋如何識別欺詐行為的重要性進一步增加了任務的複雜性。
為了構建這些檢測模式,一個領域專家團隊根據欺詐者的典型行為提出了一組規則。工作流可能包括財務欺詐檢測領域的主題專家,他將特定行為的一組需求放在一起。然後,數據科學家可以從可用數據中提取子樣本,並使用這些要求和可能的一些已知的欺詐案例,選擇一組深度學習或機器學習算法。為了將模式投入生產,數據工程師可能會將結果模型轉換為一組帶有閾值的規則,通常使用SQL實現。
該方法允許金融機構提出一組明確的特征,從而識別符合《一般數據保護條例》(GDPR).然而,這種方法也帶來了許多困難。使用硬編碼規則集實現欺詐檢測係統是非常脆弱的。對欺詐模式的任何改變都需要很長時間才能更新。這反過來又使其難以跟上和適應當前市場上發生的欺詐活動的變化。
此外,上麵描述的工作流中的係統通常是孤立的,領域專家、數據科學家和數據工程師都是分開的。數據工程師負責維護大量數據,並將領域專家和數據科學家的工作轉化為生產級代碼。由於缺乏通用平台,領域專家和數據科學家不得不依賴Beplay体育安卓版本適合於一台機器的采樣數據進行分析。這會導致溝通困難,最終導致缺乏合作。
在本博客中,我們將展示如何將幾個這樣的基於規則的檢測用例轉換為Databricks平台上的機器學習用例,統一欺詐檢測的關鍵參與者:領域專家、數據科學家和數據工程師。Beplay体育安卓版本我們將學習如何創建機器學習欺詐檢測數據管道,並利用從大型數據集構建模塊化功能的框架實時可視化數據。我們還將學習如何使用決策樹和Apache Spark MLlib檢測欺詐。然後,我們將使用MLflow迭代和細化模型,以提高其準確性。
用機器學習解決問題
在金融領域,人們對機器學習模型有一定程度的不情願,因為人們認為它們提供了一個“黑匣子”解決方案,無法證明已識別的欺詐案例是正確的。GDPR要求以及金融監管規定使得利用數據科學的力量似乎不可能。然而,幾個成功的用例已經表明,應用機器學習大規模檢測欺詐可以解決上麵提到的許多問題。
訓練一個有監督的機器學習模型來檢測金融欺詐是非常困難的,因為實際確認的欺詐行為示例數量很少。然而,存在一組已知的規則來識別特定類型的欺詐可以幫助創建一組合成標簽和一組初始特征。由該領域的領域專家開發的檢測模式的輸出很可能已經經過了適當的批準流程,才能投入生產。它產生預期的欺詐行為標誌,因此可以用作訓練機器學習模型的起點。這同時緩解了三個問題:
- 缺乏培訓標簽,
- 決定使用什麼功能,
- 為模型提供適當的基準。
訓練機器學習模型來識別基於規則的欺詐行為標誌,可以通過混淆矩陣與預期輸出進行直接比較。如果結果與基於規則的檢測模式密切匹配,這種方法有助於獲得懷疑論者對基於機器學習的欺詐預防的信心。該模型的輸出非常容易解釋,與原始檢測模式相比,可以作為預期假陰性和假陽性的基線討論。
此外,如果使用決策樹模型作為初始機器學習模型,則可能會進一步緩解機器學習模型難以解釋的問題。由於模型被訓練成一組規則,決策樹很可能優於任何其他機器學習模型。當然,額外的好處是模型的最大透明度,它將從本質上顯示欺詐的決策過程,但沒有人為幹預,也不需要硬編碼任何規則或閾值。當然,必須理解模型的未來迭代可能完全利用不同的算法來獲得最大的精度。模型的透明性最終是通過理解算法中的特征來實現的。具有可解釋的特征將產生可解釋和可辯護的模型結果。
機器學習方法的最大好處是,在最初的建模工作之後,未來的迭代是模塊化的,更新標簽、特征或模型類型的集合非常容易和無縫,減少了生產的時間。在Databricks統一分析平台上,領域專家、數據科學家和數據工程師可以大規模地使用相同的數據集,並直接在筆記本環境中協作。Beplay体育安卓版本讓我們開始吧!
攝取和探索數據
在這個例子中,我們將使用一個合成數據集。要自己加載數據集,請下載從Kaggle導入到本地機器,然後通過import data -導入數據Azure和AWS
PaySim數據模擬了移動貨幣交易,基於一個非洲國家實施的移動貨幣服務一個月的財務日誌中提取的真實交易樣本。下表顯示了該數據集提供的信息:
探索數據
創建數據框架-現在我們已經上傳了數據到數據庫文件係統(DBFS),我們可以快速輕鬆地創建DataFrames使用Spark SQL
#創建df DataFrame包含我們的模擬財務欺詐檢測數據集df=火花。sql("select step, type, amount, nameorg, oldbalanceOrg, newbalancorg, nameDest, oldbalanceDest, newbalanceDest from sim_fin_fraud_detection")
現在我們已經創建了DataFrame,讓我們看一看模式和用於檢查數據的前1000行。
#檢查數據的模式df.printSchema ()根| - - -步驟:整數(可空=真正的)| - - -類型:字符串(可空=真正的)|——數量:雙(可空=真正的)|——nameOrig:字符串(可空=真正的)|——oldbalanceOrg:雙(可空=真正的)|——newbalanceOrig:雙(可空=真正的)|——命名:字符串(可空=真正的)|——oldbalanceDest:雙(可空=真正的)|——newbalanceDest:雙(可空=真正的)
交易類型
讓我們將數據可視化,以了解數據捕獲的事務類型及其對整體交易量的貢獻。
為了了解我們談論的是多少錢,讓我們根據交易類型以及它們對轉移現金金額的貢獻(即總和(金額))來可視化數據。
基於規則的模型
我們不太可能從已知欺詐案例的大量數據集開始訓練我們的模型。在大多數實際應用中,欺詐檢測模式是由領域專家建立的一組規則識別的。在這裏,我們創建一個名為標簽
基於這些規則。
#識別已知欺詐行為的規則df = df. withcolumn (“標簽”,F.when (((df.oldbalanceOrg56900) & (df. newbalanceorigin .56900) & (df. newbalanceorigin .>12) & (df。量>1160000)),1) .otherwise (0))
可視化規則標記的數據
這些規則經常標記出相當多的欺詐案件。讓我們可視化標記的事務的數量。我們可以看到,規則將大約4%的案件和11%的總金額標記為欺詐。
選擇合適的機器學習模型
在許多情況下,不能使用黑盒方法進行欺詐檢測。首先,領域專家需要能夠理解為什麼某個交易被識別為欺詐。然後,如果要采取行動,就必須在法庭上出示證據。決策樹是一個容易解釋的模型,是這個用例的一個很好的起點。
創建訓練集
為了構建和驗證我們的ML模型,我們將使用80/20分割.randomSplit
.這將隨機選擇80%的數據用於訓練,剩下的20%用於驗證結果。
將數據集劃分為訓練數據集和測試數據集(train, test) = df.randomSplit([0.8,0.2),種子=12345)
創建ML模型管道
為了為模型準備數據,我們必須首先將分類變量轉換為數值變量.StringIndexer
.然後,我們必須將我們希望模型使用的所有特性組裝起來。除了決策樹模型之外,我們還創建了一個管道來包含這些特征準備步驟,這樣我們就可以在不同的數據集上重複這些步驟。請注意,我們首先將管道與訓練數據相匹配,然後在後麵的步驟中使用它來轉換測試數據。
從pyspark.ml進口管道從pyspark.ml.feature進口StringIndexer從pyspark.ml.feature進口VectorAssembler從pyspark.ml.classification進口DecisionTreeClassifier#將標簽字符串列編碼為標簽索引列indexer = StringIndexer(inputCol =“類型”, outputCol =“typeIndexed”)# VectorAssembler是一個轉換器,它將一個給定的列列表組合為一個向量列va = VectorAssembler(inputCols = [“typeIndexed”,“數量”,“oldbalanceOrg”,“newbalanceOrig”,“oldbalanceDest”,“newbalanceDest”,“orgDiff”,“destDiff”], outputCol =“特征”)#使用決策樹分類器模型dt = DecisionTreeClassifier(labelCol =“標簽”, featuresCol =“特征”, seed =54321, maxDepth =5)#創建管道階段管道=管道(階段=[索引器,va, dt])#查看決策樹模型(在CrossValidator之前)Dt_model = pipe .fit(train)
可視化模型
調用顯示()
在管道的最後一個階段,即決策樹模型,允許我們查看每個節點上所選決策的初始擬合模型。這有助於理解算法是如何得出預測結果的。
顯示器(dt_model.stages [1])
模型優化
為了確保我們有最佳的擬合樹模型,我們將用幾個參數變量交叉驗證模型。鑒於我們的數據包含96%的陰性病例和4%的陽性病例,我們將使用精度-召回(PR)評估指標來解釋不平衡分布。
< b >從pyspark.ml.tuning . bb0進口 CrossValidator, ParamGridBuilder#構建不同參數的網格paramGrid = ParamGridBuilder() \.addGrid (dt。maxDepth, (5,10,15]) \.addGrid (dt。maxBins, (10,20.,30.]) \.build ()#構建交叉驗證crossval =交叉驗證器(估計= dt,estimatorParamMaps = paramGrid,evaluator = evaluatorPR,numFolds =3.)#建立簡曆渠道pipelineCV = Pipeline(stages=[indexer, va, crossval])使用管道,參數網格和前麵的BinaryClassificationEvaluator訓練模型cvModel_u = pipelineCV.fit(train)
模型的性能
我們通過比較訓練集和測試集的精度-召回率(PR)和ROC曲線下麵積(AUC)指標來評估模型。PR和AUC似乎都很高。
#建立最好的模型(訓練和測試數據集)train_pred = cvModel_u.transform(train)test_pred = cvModel_u.transform(test)在訓練數據集上評估模型pr_train = evaluatorPR.evaluate(train_pred)auc_train = evaluatorAUC.evaluate(train_pred)在測試數據集上評估模型pr_test = evaluatorPR.evaluate(test_pred)auc_test = evaluatorAUC.evaluate(test_pred)打印PR和AUC值打印(“公關培訓:“pr_train)打印(”AUC訓練:“auc_train)打印(“公關測試:”pr_test)打印(“AUC測試:“auc_test)
---#輸出:# PR列車:0.9537894984523128# AUC列車:0.998647996459481# PR測試:0.9539170535377599# AUC測試:0.9984378183482442
為了了解模型如何對結果進行錯誤分類,讓我們使用matplotlib和pandas來可視化我們的混淆矩陣。
平衡類
我們看到該模型比原來的規則多識別了2421個案例。這並不像發現更多潛在的欺詐案件那樣令人擔憂,這可能是一件好事。然而,有58個病例沒有被算法檢測到,但最初被識別出來。我們將嚐試通過使用欠抽樣來平衡我們的類來進一步改進我們的預測。也就是說,我們將保留所有欺詐案例,然後對非欺詐案例進行抽樣,以匹配該數字,從而獲得平衡的數據集。當我們可視化我們的新數據集時,我們看到是和否的情況是50/50。
#重置數據幀為no fraud (' dfn ')和fraud (' dfy ')DFN =火車。過濾器(火車。標簽==0)火車。過濾器(火車。標簽==1)#計算彙總指標N = train.count()Y = dfy.count()p = y/N#創建一個更平衡的訓練數據集Train_b = fdf .sample( .sample假, p, seed =92285) .union (dfy)#打印指標打印(“總計數:%s,欺詐案件計數:%s,欺詐案件比例:%s”% (N, y, p))打印("平衡訓練數據集計數:%s"% train_b.count ())
---#輸出:#總計數:5090394,欺詐案件計數:204865,欺詐案件比例:0.040245411258932016#平衡訓練數據集計數:401898---#顯示我們更平衡的訓練數據集顯示器(train_b.groupBy (“標簽”) .count ())
更新管道
現在讓我們更新毫升管道並創建一個新的交叉驗證器。因為我們正在使用ML管道,我們隻需要用新的數據集更新它,我們可以快速重複相同的管道步驟。
#重新運行相同的ML管道(包括參數網格)crossval_b =交叉驗證器(估計= dt,estimatorParamMaps = paramGrid,評估器=評估auc,numFolds =3.)pipelineCV_b = Pipeline(stage =[indexer, va, crossval_b])使用管道,參數網格和BinaryClassificationEvaluator使用' train_b '數據集訓練模型cvModel_b = pipelineCV_b.fit(train_b)#構建最佳模型(平衡訓練和完整測試數據集)train_pred_b = cvModel_b.transform(train_b)test_pred_b = cvModel_b.transform(test)在平衡訓練數據集上評估模型pr_train_b = evaluatorPR.evaluate(train_pred_b)auc_train_b = evaluatorAUC.evaluate(train_pred_b)在完整的測試數據集上評估模型pr_test_b = evaluatorPR.evaluate(test_pred_b)auc_test_b = evaluatorAUC.evaluate(test_pred_b)打印PR和AUC值打印(“公關培訓:“pr_train_b)打印(”AUC訓練:“auc_train_b)打印(“公關測試:”pr_test_b)打印(“AUC測試:“auc_test_b)
---#輸出:# PR列車:0.999629161563572# AUC列車:0.9998071389056655# PR測試:0.9904709171789063# AUC測試:0.9997903902204509
回顧結果
現在讓我們看看新的混淆矩陣的結果。該模型隻識別錯了一起欺詐案。平衡類似乎改進了模型。
模型反饋和使用MLflow
一旦選擇了用於生產的模型,我們希望持續收集反饋,以確保模型仍然識別出感興趣的行為。由於我們從基於規則的標簽開始,我們希望為未來的模型提供基於人類反饋的經過驗證的真實標簽。這一階段對於在機器學習過程中保持信心和信任至關重要。由於分析人員不能審查每一個單獨的案例,我們希望確保我們向他們展示了精心選擇的案例,以驗證模型輸出。例如,模型的確定性較低的預測是分析人員檢查的好對象。這種反饋的加入將確保模型隨著環境的變化而不斷改進和進化。
MLflow在我們訓練不同模型版本時幫助我們完成這個循環。我們可以跟蹤我們的實驗,比較不同模型配置和參數的結果。例如,在這裏,我們可以使用MLflow UI比較在平衡數據集和不平衡數據集上訓練的模型的PR和AUC。數據科學家可以使用MLflow跟蹤各種模型指標以及任何額外的可視化和工件,以幫助決定應該在生產中部署哪個模型。然後,數據工程師將能夠輕鬆地檢索所選擇的模型以及用於培訓的庫版本,將其作為.jar文件部署到生產中的新數據上。因此,審查模型結果的領域專家、更新模型的數據科學家和在生產中部署模型的數據工程師之間的協作將在整個迭代過程中得到加強。
https://www.youtube.com/watch?v=x_4S9r-Kks8
https://www.youtube.com/watch?v=BVISypymHzw
結論
我們已經回顧了如何使用基於規則的欺詐檢測標簽並使用Databricks和MLflow將其轉換為機器學習模型的示例。這種方法允許我們構建一個可擴展的模塊化解決方案,幫助我們跟上不斷變化的欺詐行為模式。建立一個機器學習模型來識別欺詐,允許我們創建一個反饋循環,允許模型進化並識別新的潛在欺詐模式。我們已經看到,由於決策樹模型的可解釋性和出色的準確性,它是如何將機器學習引入欺詐檢測程序的一個很好的起點。
使用Databricks平台的一個主要好處是,它允許數據科學家、工程師和業務用戶Beplay体育安卓版本在整個過程中無縫地一起工作。準備數據、構建模型、共享結果以及將模型投入生產現在都可以在同一個平台上進行,從而實現前所未有的協作。Beplay体育安卓版本這種方法在以前孤立的團隊之間建立信任,導致有效和動態的欺詐檢測程序。
試試這個筆記本隻需在幾分鍾內注冊免費試用,就可以開始創建自己的模型。