search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

深度學習 | Keras自動編碼器實現信用卡欺詐偵測建模

今天本計劃飛廣州,結果到機場后航班全部取消,只好返回學校,吃午飯到實驗室與同學們交流最近的情況,靜下心來寫寫深度學習建模的心得。

看到一篇國外博客關於用Keras的autoencoder自編碼器模型做銀行信用卡欺詐的分類模型,比較有興趣,因為過去採用數據挖掘建模做過類似模型,現在看看如何用Deep Autoencoder來玩模型。

建立銀行客戶信用卡欺詐模型傳統上主要藉助數據挖掘建模技術,一般採用統計建模或機器學習演算法,比如羅輯斯特回歸logistics,判別分析等多變數統計方法,或者決策樹、支持向量機SVM、貝葉斯網路、最近鄰居法KNN、神經網路Nearul Network等,這裡的神經網路建模主要還是單隱含層的機器學習演算法。

最近深度學習技術開始流行,特別是在圖像識別、自動駕駛、機器翻譯、遊戲Player等領域有了飛速發展。特別是google開源了tensorflow庫后,加上Keras的開源頂層框架,使得深度學習建模技術應用價值和潛在應用場景廣泛而深遠,特別是最近人工智慧AI的火爆,更凸顯了深度學習技術在大數據支撐下的技術迭代。

最近開始學習深度學習的基本演算法和建模技巧,深感在大數據背景下,有了機器學習不愛用統計技術了,有了深度學習誰還用機器學習。當然這是調侃,只是強大深度學習有可能帶來演算法的革命!

下面我通過學習演示採用Keras的自動解碼器模型(auotencoding)分析銀行信用卡的欺詐偵測模型。

推薦你的系統預先要安裝:

1-Python2.7,推薦Anaconda安裝Python環境,會自動予安裝很多依賴包。

2-Tensorflow包,google開源的,目前最流行的深度學習包。

3-Keras包,支持Tensorflow和Theano作為backend,俺一直選Tensorflow。

我比較喜歡用Jupyter Notebook進行交互編程。

首先我們載入需要的各種Python包:

Using TensorFlow backend.

深度學習嚴重依賴numpy、sklearn、pandas、scipy等各種數組運算能力和數學矩陣演算法。

載入銀行信用卡數據,俺存儲在啟動目錄的 'data/creditcard.csv'

數據源來自 Kaggle看狗kaggle是數據科學之家,大量懸賞性建模項目都在上面,喜歡數據科學的都應該儘快建立一個賬號,有大量的數據開源,同時能看到世界建模高手的源代碼,甚至可以直接在上面運行代碼,主要都是Python和R語言。

數據源包含兩天的284807筆交易記錄,其中有492筆交易是標註為欺詐。

特別說明:影響欺詐因素包含有25個數值型自變數v1 to v28,我們看不到原始數據,而是經過PCA主成分分析后產生的25個主成分變數,這給了我一個啟發:這也是數據脫敏技術的重要手段,今後如果涉及數據隱私可以進行PCA變換后提交給第三方。

另外有兩個變數沒有改變,交易Time和交易金額Amount;

其中Time是表示該筆交易與前一筆交易的間隔時間(秒);

我們簡單看看數據結構:31列變數

也沒有缺失值missing value。

最後一列是Class:1-Fraud,0-Normal

我們看看目標變數class的分佈情況:

從圖中看出,欺詐類別是粒度非常不平衡的,28多萬筆交易中欺詐比例非常小,當然這是再正常不過了,如果有10%的欺詐銀行估計該倒閉了,呵呵。

在傳統的數據挖掘建模中,往往針對這種情況需要進行過度抽樣或進行交叉驗證技術驗證模型。

我先進行描述性統計分析,看看數據結構和統計量

採用交易金額數量進行class分類圖表分析:

採用交易時間線進行class分類圖表分析:

通過輸入數據,抽象數據結構,將多維或高維數據壓縮成為低維數據表現,進行編碼器encode,然後將壓縮降維后數據輸入作為解碼器進行表現,使之更準確代表原始輸出結果,這裡是解釋能夠更好代表Class類別分類正確性。

深度學習演算法主要是數學知識,有必要重新複習一些線性代數、高等數據的基礎知識了,比如;微分、求導、矩陣變換、映射、函數變換等。

圖示可視化自動編碼器模型如下:

包括輸入層,編碼器網路,解碼器網路,輸出層。

模型優化和參數調整:

深度學習的重要特徵就是輸入層經過隱含層與輸出層不斷傳遞過程叫向前傳播,為了得多最優化解或權重,需要不斷向後傳播調整權重,修正參數期望得到最優解。也就是為了使得輸入的誤差與輸出后重構的誤差最小化。

這裡採用了傳統的絕對誤差平方:

準備深度學習Autoencoder自動編碼器數據:

我們採用深度學習演算法的時候,我們已經不需要時間Time變數了,同時我們引入sklearn的StandardScaler函數將交易額Amount數據標準化為(-1,1)之間。

這裡強調,深度學習一般都需要將數據標準化,(0,1)或(-1,1)之間。

將數據拆分為train和test數據集:train=0.80,test=0.20

隨機種子設定一開始就設好了,以便可以重複建模。

在拆分數據集中我們也drop掉了class變數,一方面可以看出自動編碼器演算法Autoencoder實際上是一種特殊的非監督類演算法,或者是半監督類演算法。

搭建Autoencoder模型:

自動編碼器分別建立4個完全連接Dense層,分別為14,7,7,29個神經元。前兩層用於編碼器encode,最後兩層用於解碼器decode。訓練期間將使用L1正規化

深度學習建模一般是先搭建好神經網路的模型框架,後面進行編譯和擬合時載入數據集。

編碼器和解碼器層分別採用了「tanh」和「relu」激活函數。

訓練模型設定為100個epochs,批量bitch大小為32個樣本,並將最佳性能模型check-point點保存到一個文件。由Keras提供的ModelCheckpoint對於這些任務來說非常方便。此外,訓練進度將以TensorBoard了解的格式導出。

最終模型經過大概50分鐘的訓練,完成!重新載入存儲的model.h5數據集。

俺一直在考慮是否購買帶GPU的電腦,很多大的數據訓練CPU夠嗆,不過還是先在AWS上註冊採用GPU的雲計算模式試試。

評估一些模型效果:

模型的損失基本上維持在0.76以下,可以看出經過100個epochs迭代較好收斂。

預測一下測試數據集的情況:

重構后的解碼器預測測試集平均誤差在0.73左右。

重構不含欺詐記錄的錯誤分佈:

重構含有欺詐記錄的錯誤分佈:

ROC模型評估圖:

ROC模型評估曲線非常不錯,說明模型有效,可以較好的偵測到欺詐者,準確度95.83%; ROC是累計風險評估曲線。

精確度和召回率:

為了更好地了解什麼是精確度和召回率,其中精度測量結果的相關性,衡量有多少相關結果被召回。這兩個值都可以取0到1之間的值。當然值=1最好。

一般高召回但低精度意味著許多結果,其中大部分具有低或無相關性。精度很高但是回憶很低時,有相反的回報結果與相關性很高。理想情況下,需要高精度和高回想率。(類似一種錯誤的分類矩陣)

我們先計算召回率與精確度:

不同閥值Threshold的精確度:

不同閥值的召回率:

為了預測新/不可見的信用卡交易是否正常或欺詐,我們可以從交易數據本身計算重建錯誤。如果錯誤大於預定閾值,我們將其標記為欺詐

(我們期望的模型在正常交易中應該有一個低錯誤),設定閥值:threshold=2.9,看看預測情況:

更直觀的錯誤分類矩陣:

從錯誤分類矩陣可以看出,(55557+79)/ all = 97.67%。 這是一個非常不錯的分類鑒別器。

參考文章來源:https://medium.com/@curiousily/credit-card-fraud-detection-using-autoencoders-in-keras-tensorflow-for-hackers-part-vii-20e0c85301bd

沈浩老師

——————

傳媒大學新聞學院教授、博士生導師傳媒大學調查統計研究所所長

_2001數藝智訓DAtraining

歡迎關註:靈動數藝

——數藝智訓

數據藝術家TableauHome



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦