機器學習之信用卡盜刷預測實戰
專案名稱
:
信用卡盜刷
專案概述
:利用信用卡歷史交易資料進行機器學習,構建信用卡反欺詐預測模型,提前發現使用者信用卡被盜刷的事件。
專案背景
:資料包含了由歐洲持卡人於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,與初始模型擬合調用引數一致,無需再次調優,已經尋找到最優模型。
總結
對於二分類資料,擬優先考慮邏輯迴歸模型,其中關鍵是對資料進行預處理,包括資料標準化、缺失值處理、資料不平衡處理、特徵工程處理,做對了預處理,模型建模已經成功了一半。如果有疑問或者不懂,歡迎與我交流。部分細節知識如:混淆矩陣、召回率、模型調優,後續展開講解,敬請期待。