您當前的位置:首頁 > 攝影

機器學習之信用卡盜刷預測實戰

作者:由 Anna 發表于 攝影時間:2022-11-18

專案名稱

信用卡盜刷

專案概述

:利用信用卡歷史交易資料進行機器學習,構建信用卡反欺詐預測模型,提前發現使用者信用卡被盜刷的事件。

專案背景

:資料包含了由歐洲持卡人於2013年9月使用信用卡進行交易的資料。284807筆交易中有492筆被盜刷。資料非常不均衡,被盜刷資料佔所有交易的0。172%。

建模過程

1) 場景解析

2) 資料預處理

3) 特徵工程

4) 模型訓練

5) 模型評估與最佳化

一、場景解析

首先觀察資料集以及涉及的指標:

import

numpy

as

np

#匯入相關的庫

import

pandas

as

pd

import

matplotlib。pyplot

as

plt

mydata

=

pd

read_csv

‘E:/creditcard。csv’

#載入資料

mydata

head

()

mydata

describe

()

mydata

info

()

機器學習之信用卡盜刷預測實戰

前五行資料

機器學習之信用卡盜刷預測實戰

資料描述

機器學習之信用卡盜刷預測實戰

觀察有沒有缺失值

資料集一共有31個指標,其中指標V1—V28已經進行標準化處理,沒有缺失值,Amount代表金額,資料存在波動,需要進行標準化處理,CLass列代表盜刷情況,其中0代表正常,1代表被盜刷。

二、資料預處理

將金額資料Amount進行標準化處理,設定資料區間【-1,1】。

pd。value_counts(mydata[‘Class’],sort=True)

from sklearn。preprocessing import StandardScaler

mydata[‘Amount’]=StandardScaler()。fit_transform(mydata。Amount。values。reshape(-1,1))

mydata。head()

機器學習之信用卡盜刷預測實戰

被盜刷資料分佈

機器學習之信用卡盜刷預測實戰

標準化處理後的資料集

由於被盜刷資料僅492條,資料分佈極為不均衡,此處使用SMOTE函式進行過取樣處理,使得正常資料與盜刷資料數量一樣多。

data=mydata。drop(‘Class’,axis=1)

X=data

y=mydata[‘Class’]

from imblearn。over_sampling import SMOTE

smote=SMOTE()

X_smote,y_smote=smote。fit_resample(X,y)

X_smote。shape

pd。value_counts(y_smote)

機器學習之信用卡盜刷預測實戰

正常資料與被盜刷資料數量一致

三、特徵工程

由於V1-V28為標準化處理資料且經過主成分分析,因此這裡無需二次處理。

四、模型訓練

from

sklearn。model_selection

import

train_test_split

X_train

X_test

y_train

y_test

=

train_test_split

X_smote

y_smote

test_size

=

0。2

from

sklearn。linear_model

import

LogisticRegression

#匯入邏輯迴歸包

lg

=

LogisticRegression

C

=

1。0

#設定正則化係數

lg

fit

X_train

y_train

#模型擬合

五、模型評估與最佳化

y_pre2=lg。predict(X)

mydata[‘預測’]=list(y_pre2)

from sklearn。metrics import confusion_matrix,recall_score

recall_score(y,y_pre2,pos_label=0)

0。9829062835235566

將原始特徵矩陣X帶入,得出預測目標陣列,然後對預測結果進行召回率打分,得分0。9829,意思是原始資料集中,為正例的結果中有98。29%都是正確的,即98。29%的正常交易被準確識別了。

confusion_matrix(y,y_pre2)#混淆矩陣

機器學習之信用卡盜刷預測實戰

預測結果

import itertools

def plot_confusion_matrix(cm, classes,

title=‘Confusion matrix’,

cmap=plt。cm。Blues):

plt。imshow(cm, interpolation=‘nearest’, cmap=cmap)

plt。title(title)

tick_marks = np。arange(len(classes))

plt。xticks(tick_marks, classes, rotation=0)

plt。yticks(tick_marks, classes)

threshold = cm。max() / 2。

for i, j in itertools。product(range(cm。shape[0]), range(cm。shape[1])):

plt。text(j, i, cm[i, j],

horizontalalignment=“center”,

color=“white” if cm[i, j] > threshold else “black”)#若對應格子上面的數量不超過閾值則,上面的字型為白色,為了方便檢視

plt。tight_layout()

plt。ylabel(‘True label’)

plt。xlabel(‘Predicted label’)

cm = confusion_matrix(y,y_pre2)

class_names = [0,1]

plot_confusion_matrix(cm,classes=class_names,

title=‘logit_Confusion matrix,recall is {:。4f}’。format(recall_score(y,y_pre2,pos_label=0)))

機器學習之信用卡盜刷預測實戰

視覺化結果

結果解讀:279455萬條正常交易資料被準確識別;439條盜刷交易也被正常識別。4860條原本是正常交易的資料被誤判成盜刷交易(誤報);53條盜刷交易被識別成正常交易(漏報)。從結果來看,模型整體預測效果不錯。

from sklearn。model_selection import GridSearchCV #模型最佳化

clf = GridSearchCV(lg,param_grid={‘C’:[0。1,0。2,0。4,0。6,1。0,10,100]})#尋找最優正則化係數

clf。fit(X_train,y_train)

display(clf。best_score_,clf。best_params_)

機器學習之信用卡盜刷預測實戰

最優結果

最最佳化模型顯示最佳正則化係數為1。0,與初始模型擬合調用引數一致,無需再次調優,已經尋找到最優模型。

總結

對於二分類資料,擬優先考慮邏輯迴歸模型,其中關鍵是對資料進行預處理,包括資料標準化、缺失值處理、資料不平衡處理、特徵工程處理,做對了預處理,模型建模已經成功了一半。如果有疑問或者不懂,歡迎與我交流。部分細節知識如:混淆矩陣、召回率、模型調優,後續展開講解,敬請期待。

標簽: 資料  cm  myData  plt  模型