---
# System prepended metadata

title: ML&F
tags: [MF]

---

---
title: ML&F
tags: MF
---

# IEEE-CIS Credit fraud detection 

#### keywords: credit card fraud detection,binary classification

---


## 1.動機 Motivations

---


![](https://i.imgur.com/jNaGOrb.png)

[小心網購！今年信用卡小額網路盜刷大增26.5％](https://udn.com/news/story/7239/5444760)
[今年前 5 月信用卡盜刷高達 6.2 億，多數來自蘋果、Google、亞馬遜](https://technews.tw/2021/08/18/ec-pay/)

針對時事新聞，我有興趣建立一個**信用卡檢測系統**來識別欺詐性信用卡交易。這樣客戶就不會因為他們沒有購買的商品而被收取費用。

這個專案的好處: 
* 有效且不費力地打擊欺詐
* 防止狡猾的欺詐交易(手動定義的規則通常無法預料)
* 為全球數百萬人提高欺詐交易警報的效力，幫助數十萬企業減少欺詐損失並增加收入
---



## 2.資料視覺化 Exploratory data analysis (EDA)

---
Data Source link: [IEEE-CIS Fraud Detection](https://www.kaggle.com/c/ieee-fraud-detection)
:::warning
IEEE-CIS與世界領先支付服務公司 Vesta Corporation合作，尋求**欺詐預測**的最佳解決方案。Data來自Vesta的真實電商交易，包含從設備類型到產品特徵等等資料。
:::
:::info
* train_identity.csv
* train_transaction.csv
* test_identity.csv
* test_transaction.csv
:::


:bulb: Data Description



本次有兩個資料集: 身分資訊資料集(identity)、交易資料集(transaction)
| Transaction |       |
| -------- | -------- | 
| Variable | Description |
| TransactionID | 交易ID  |
| TransactionDT | 來自給定參考日期時間的時間增量（不是實際時間戳）   |
| TransactionAMT | 以美元為單位的交易支付金額  |
| ProductCD | 產品代碼（每筆交易的產品）     |
| card1–6 | 支付卡相關信息，如卡類型、國家等    |
| addr1 | 帳單區域 |
| addr2 | 帳單國家    |
| dist1 & dist2 | 一些距離信息，（不限於）帳單地址、郵寄地址、郵政編碼、IP 地址、電話區等之間的距離|
| P_emaildomain | 購買者的電子郵件domain   |
| R_emaildomain | 收件人的電子郵件domain     |
| C1-C14 | 計數，如發現有多少地址與支付卡關聯等，實際含義被屏蔽     |
| D1-D15 | 時間增量，例如之前交易之間的天數等    |
| M1-M9 | 匹配，如卡片上的名字和地址等    |
| Vxxx |設計了豐富的功能，包括排名、計數和其他實體關係   |

| Identity |       |
| -------- | -------- | 
| Variable | Description |
| Transaction id | 交易Id     |
| DeviceType | 用於交易的設備類型     |
| DeviceInfo | 有關所用設備的更多信息    |
| id 1-38 | 網絡連接信息、瀏覽器信息等（id 12-38為分類信息） |





:bulb: EDA




### [2.1]資料集觀察
1. 合併交易與身分資料集，並印出測試與訓練資料集shape
    
    ![](https://i.imgur.com/V7F8HM4.png)
    
    :::info
    訓練資料有590540列資料，434個欄位(有isFraud)
    測試資料有506691列資料，433個欄位 
    :::
---


2. 看訓練資料集describe
![](https://i.imgur.com/32NhjA3.png)

    :::info
    觀察出 isFraud(=1) 約只有3.5%，可以看出這是一個**嚴重不平衡**的資料集。第二件事情，可以**看到有很多欄位具有缺失值**。 
    :::

3. 觀看缺失值
* df_train
![](https://i.imgur.com/VULHyOf.png)
* df_test
![](https://i.imgur.com/NHJ4U5g.png)
    
    :::info
    我們可以看到像         id_21,id_22,id_23,id_24,id_25,id_26,id_27,id_07,id_08 
    這樣的列**有超過 99% 的缺失值**，後續可以考慮不要納入這些屬性。
    :::

---


### [2.2]isFraud(Target)
1. 觀察比例
    
    ![](https://i.imgur.com/uVBrwJf.png)
    
    :::info
    正如前面describe描述，我們可以看到Target**嚴重不平衡**，
    這裡 96.5% 的交易不是欺詐，其餘 3.5% 的交易是欺詐。
    因此我知道未來將選擇 ROC 曲線下的面積 (AUC) 作為我們 ML 問題的度量。
    :::
    
    :::warning
    考慮問題: 為什麼不能使用準確性作為衡量標準？
    考慮這樣一個場景，我們有一個不平衡的數據集。例如，考慮信用卡欺詐檢測的情況，其中 98% 的分數為非欺詐，其餘 2% 的分數為欺詐。在這種情況下，即使我們將所有點預測為非欺詐，我們也將**獲得 98% 的準確率**。但實際上，情況並非如此。所以我們不能使用準確性作為衡量標準。
    :::
---


### [2.3]TransactionDT 
1. 描述->來自給定參考日期時間的時間增量（不是實際時間戳）。
(從description可以得知最小值是86400，因此我們可以估計是以秒為單位。)
2. 沒有缺失值
3. 是否隨時間連續
在這裡，我們想檢查在訓練和測試中獲得的資料**是否隨時間連續**。這對於訓練-測試分割很重要。這意味著訓練資料應該來自更早的時期，而測試資料應該來自更晚的時期。
    ![](https://i.imgur.com/T3DPv5e.png)
    :::info
    * 兩者之間略有差距且訓練集來自較早的時間段，而測試數據來自較晚的時間段。這可能會**影響待會使用的訓練驗證拆分或交叉驗證**。
    * 某些時間的交易量超過10000。
    :::

---    


4. 看看一周中不同日子以及不同時間的欺詐交易
![](https://i.imgur.com/coNRaWv.png)
![](https://i.imgur.com/32WXrHx.png)

    :::info
    * 第 3 天的欺詐交易非常少
    * 第 7 個小時欺詐交易的百分比與其他時間相比較高

    :::
---


### [2.4]TransactionAmt
1. 描述->以**美元**為單位的交易支付金額
2. 沒有缺失值
3. 觀察每個小時平均值以及畫出詐欺曲線.
![](https://i.imgur.com/Us9yapV.png)
4. 觀察看看有沒有outlier
![](https://i.imgur.com/zY28TL6.png)
    :::info
    可以觀察到訓練數據中有一個點的數量 > 30000。選擇刪除異常值，因為它會影響我們的模型（尤其是基於距離的算法，如邏輯回歸、knn 等）的預測。
    此外，像這樣的**異常值會導致過度擬合問題**。因此，後續決定刪除訓練集中大於 30,000 的值。
    :::
    
    4.1 更新df_train
    ![](https://i.imgur.com/5ClrjU2.png)
5.看分佈
![](https://i.imgur.com/eCrIrdn.png)
:::info
In train data Minimum transaction amount is 0.251 and maximum amount  is 31937.391
In test data Minimum transaction amount is 0.018000000000000002 and maximum amount  is 10270.0
:::
5.1 取log
![](https://i.imgur.com/KRlLS1n.png)
![](https://i.imgur.com/AQWj0Ci.png)
:::info
Mean transaction amt for fraud is 4.3506 ie, 77.5264 dollars
Mean transaction amt for non-fraud is 4.3643 ie, 78.5978 dollars
Median transaction amt for fraud is 4.3175  ie, 75.0000 dollars
Median transaction amt for non-fraud is 4.2268  ie, 68.5000 dollars
:::
:::warning
1.欺詐交易的中位數略高。
2.同樣在欺詐交易中，我們有一個更好的正態分佈，它在鐘形曲線上很寬。它表明在特定時間段存在更多欺詐交易。
3. 'LogTransactionAmt' 大於 5.5（244 美元）且小於 3.3（27 美元）的交易似乎具有更高的欺詐機率。
:::
---


### [2.5]ProductCD
1. 描述->產品代碼（每筆交易的產品）
2. 沒有缺失值
3. 類別型資料，觀察其分布
![](https://i.imgur.com/VnFzfk2.png)
    :::info
    可以看到 W 的產品為最多，接下來進一步觀察，是不是在欺詐交易中，W產品比例最多??
    :::
    3.1 
![](https://i.imgur.com/shSxo7R.png) 
    :::info
    結果發現只有大約 2% 的 Product W 交易是欺詐。
    大約**11.5%的ProductC是欺詐性交易**，此外，**大約6%的ProductS**交易是欺詐。
    :::
---


### [2.6] card1–6
1. 描述->支付卡相關信息，如卡類型、國家等
![](https://i.imgur.com/5roa5Jn.png)
2. 觀察缺失值
![](https://i.imgur.com/pBYmfag.png)
    :::info
    待會要針對缺失值做處理
    :::
3. 觀察 card1 - card6 unique value，哪些可能屬於類別型
![](https://i.imgur.com/LyxqdTN.png)

    :::info
    Card 4、Card 6可能是類別型資料。
    :::
4. 觀察連續型資料
![](https://i.imgur.com/Y5bQ84r.png)
    :::info
    可以觀察到欄位的數值範圍差很多，因此待會針對連續型資料要做正規化。
    :::
5. 觀察相關性
![](https://i.imgur.com/KjH5uk7.png)
    :::info
    各自關係不大，card 3 和 isFraud相較下有低關聯。
    :::
6.觀察 card4 & catd 6
* card4
![](https://i.imgur.com/BmxAMm7.png)
* card6
![](https://i.imgur.com/XQEngQ8.png)
    :::info
    * 根據 card4 觀察到**discover card** 有最高詐欺案件，約7.5%
    * 根據 card6 觀察到**credit card** 存在更多欺詐交易的機會。它約佔所有交易的 6.5%。
    :::

---


### [2.7] P_emaildomain & R_emaildomain
1. 描述->購買者的電子郵件domain和收件者的電子郵件domain
2. 觀察缺失值
![](https://i.imgur.com/1tG6oIU.png)
    
    :::info
    各有一些缺失值，不過不是每筆交易都會要求提供mail，好像也還可以理解，那進一步觀察哪類的電子郵件欺詐交易案件最多?
    :::
3. 觀察P_emaildomain與isFraud的關係
![](https://i.imgur.com/AxKEz6b.png)
    :::info
    * 在買方email domain，大多數郵件來自 gmail.com，其中更多的欺詐交易來自**protonmail.com**，超過 40%。
    :::
4. 觀察R_emaildomain與isFraud的關係
![](https://i.imgur.com/33Jqg2a.png)
    :::info
    * 在收件者電子郵件域中，大多數郵件來自 gmail.com
    * 其中更多的欺詐交易來自**protonmail.com**，超過 90%，這是一個嚴重的問題。
    根據上述3.的情況，可以得知更多的詐欺交易來自**protonmail.com**
    :::
---


### [2.8] DeviceType
1. 描述->用於交易的設備類型
2. 有無缺失值
![](https://i.imgur.com/wRxKtUu.png)
    
    :::info
    有些缺失值，後續可能須做處理
    :::
3. 觀察資料與isFraud的關係
![](https://i.imgur.com/74mBNVl.png)

    :::info
    觀察到欺詐交易大多是在mobile上進行的，大約有 10% 左右，而桌面交易中只有 6.2% 的欺詐交易。
    :::
---


### [2.9] Device Info
1. 描述->有關所用設備的更多信息
2. 有無缺失值
![](https://i.imgur.com/aTO7IKj.png)

    :::info
    有些缺失值，後續可能須做處理
    :::
3. 觀察資料與isFraud的關係
![](https://i.imgur.com/0EyZJ6u.png)

    ![](https://i.imgur.com/F4koEKn.png)
    :::info
    * 不同設備訊息有1786個
    * 可以觀察到約 49 個設備信息有機會被欺詐交易 > 90%
    :::
---


## 3.重述問題 Problem formulation

---
### Problem formulation 
This is a supervised learning problem: we would like to use $x$ to predict the binary variable $y$. 

We sould like to build a model to predict $y$ from $x=(x_1,\ldots,x_p)$ with $p=433$.$$Y =\left\{\begin{array}{ll}1,&\mbox{is fraudulent},\\0,&\mbox{is not fraudulent}\end{array}\right.$$

### Measures for comparisons 

首先考慮 75%-25% 的分割來獲得訓練和測試數據。
對於訓練和測試數據，輸出準確率、準確率、召回率、f1 分數和 AUC 以進行模型比較，另外**因為此次資料集是不平衡的資料，因此看AUC較為準確**!

## 4.資料分析 Data analysis

### 資料前處理 

1. 準備資料
- X_train -> 去掉 "isFraud" 問題,y_train -> "isFraud"欄位
- 針對類別型資料,全部做label-encoding
- 針對數值型資料,做正規化

2. 將df_train 切割成訓練集與驗證集

    
    ![](https://i.imgur.com/qllCqmL.png)
    :::info 
    訓練集前75%,驗證集25%
    :::
---

### Benchmark Logistic Regression
* In-sample results confusion matrix
![](https://i.imgur.com/Gz5zCne.png)





* out-of-sample results confusion matrix
75% 訓練集, 25%驗證集
![](https://i.imgur.com/sUN5fCf.png)


### 特徵工程四步驟
1. 調整參數 logistic Regression
> solver = 'liblinear',
  class_weight='balanced',
  penalty='l1',
  n_jobs=-1



2. 去除缺失值
![](https://i.imgur.com/QrLskCe.png)
:::info
根據EDA，有12個欄位缺失職>90%，直接去除掉這些欄位。
包括（id_21,id_22,id_23,id_24,id_25,id_26,id_27,id_07,id_08,id_18,dist2,D7）
:::
3. 欄位取log值[TransactionAmt]
![](https://i.imgur.com/NEV4bwO.png)
:::info
根據EDA，TransactionAmt取log值來當作新的欄位
:::
4. PCA[V1-V339]
![](https://i.imgur.com/D4S9cNb.png)
:::info
將Ｖ1-V339做PCA，thresh = 0.7，最後剩下4個欄位。
:::

 
### Logistic Regression
* In-sample results confusion matrix
![](https://i.imgur.com/zP9GyWS.png)

* out-of-sample results confusion matrix
75%訓練集,25%驗證集
![](https://i.imgur.com/WSQiNea.png)

### KNN
* In-sample results confusion matrix
![](https://i.imgur.com/GNu2J6G.png)


* out-of-sample results confusion matrix
75%訓練集,25%驗證集
![](https://i.imgur.com/gLCpUCd.png)




### Random Forest

* In-sample results confusion matrix
![](https://i.imgur.com/PX1nSEB.png)

* out-of-sample results confusion matrix
75%訓練集,25%驗證集
![](https://i.imgur.com/kSGmREb.png)

### XGBoost
* In-sample results confusion matrix
![](https://i.imgur.com/hwROm1O.png)


* out-of-sample results confusion matrix
75%訓練集,25%驗證集
![](https://i.imgur.com/fh1OWi9.png)





### Results
#### In-sample results

|Measures |BenchMark |Logistic Regression | KNN | RandomForest | XGBoost|
 |---|---|---|---| ---| ---|
|AUC| 0.5457|0.8701|0.9708|:trophy:1.|0.9999|
|Accurracy|0.9649|0.8275 |0.97| :trophy:1.|0.9978|
|Precision| 0.0|o.1388|0.7821|:trophy:1.| 0.9997|
|Recall| 0.0|0.7512|0.2021| :trophy:0.9994|0.9386|
|F1-score| 0.0|0.2343| 0.3212|:trophy:0.9997|0.9682|

#### Out-of-sample comparisons

We consider a simple 75%-25% split on the data. In the test data, we have 

|Measures |BenchMark |Logistic Regression | KNN | RandomForest | XGBoost|
 |---|---|---|---| ---| ---|
|AUC| 0.5322|0.8552| 0.824| :trophy:0.9836| 0.9745|
|Accurracy| 0.9655|0.7831|0.9663 |:trophy: 0.9911|0.99|
|Precision| 0.0|0.1227|  0.786|0.9749|:trophy:0.9802|
|Recall| 0.0|0.7686|  0.1524|:trophy:0.7866|0.7506|
|F1-score| 0.0|0.2116| 0.2553|:trophy:0.8707|0.8502|




## 5. 結論 Conclusion
1. 這次資料特色是資料量大（約60萬筆）、資料嚴重不平衡，因此在測量指標上要特別注意，以使用AUC較為客觀
2. 整體來說，模型取用RandomFores,特徵工程將資料集去除缺失值>90%欄位以及針對TransactionAmt取log值表現最佳。





### 未來發展 Future Works
在這次專案上，因為資料量大，因此跑模型起來較吃力，未來發展可以基於本篇方法，使用其他的機器學習模型以及做其他的特徵工程。




## 6. 參考資料 Reference
[淺談機器學習的效能衡量指標](https://ithelp.ithome.com.tw/articles/10229049)
[IEEE-CIS Fraud Detection - Top 5% Solution](https://towardsdatascience.com/ieee-cis-fraud-detection-top-5-solution-5488fc66e95f)
[機器學習053-數據降維絕招-PCA和核PCA](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/671529/)


## 7. 資料與程式存放 Data and code
[IEEE-CIS Fraud Detection Data](https://www.kaggle.com/c/ieee-fraud-detection)
[Code](https://colab.research.google.com/drive/1mDs8M9CZDIhtg3IZM91tohdEemxXohK8)