資料探勘—邏輯迴歸分類—信用卡欺詐分析

嚯嚯嚯嚯什麼都不會要死了發表於2020-12-26

1、分析目的:

信用卡欺詐的危害性大,如何通過遺忘的交易資料分析出每筆交易是否在正常是分析的主要目的

2、掌握要點:

  • 瞭解邏輯迴歸分類,以及如何在 sklearn 中使用它;
  • 信用卡欺詐屬於二分類問題,欺詐交易在所有交易中的比例很小,對於這種資料不平衡的情況,到底採用什麼樣的模型評估標準會更準確;
  • 完成信用卡欺詐分析的實戰專案,並通過資料視覺化對資料探索和模型結果評估進一步加強了解。

3、構建邏輯迴歸分類器

邏輯迴歸,也叫作 logistic 迴歸。雖然名字中帶有“迴歸”,但它實際上是分類方法,主要解決的是二分類問題,當然它也可以解決多分類問題,只是二分類更常見一些。在邏輯迴歸中使用了 Logistic 函式,也稱為 Sigmoid 函式。
g(z) 的結果在 0-1 之間,當 z 越大的時候,g(z) 越大,當 z 趨近於無窮大的時候,g(z) 趨近於 1。同樣當 z 趨近於無窮小的時候,g(z) 趨近於 0。同時,函式值以 0.5 為中心。
在這裡插入圖片描述
在 sklearn 中,使用 LogisticRegression() 函式構建邏輯迴歸分類器,函式裡有一些常用的構造引數:

  • penalty:懲罰項,取值為 l1 或 l2,預設為 l2。當模型引數滿足高斯分佈的時候,使用 l2,當模型引數滿足拉普拉斯分佈的時候,使用 l1;
  • solver:代表的是邏輯迴歸損失函式的優化方法。有 5 個引數可選,分別為 liblinear、lbfgs、newton-cg、sag 和 saga。預設為 liblinear,適用於資料量小的資料集,當資料量大的時候可以選用 sag 或 saga 方法。
  • max_iter:演算法收斂的最大迭代次數,預設為 10。
  • n_jobs:擬合和預測的時候 CPU 的核數,預設是 1,也可以是整數,如果是 -1 則代表 CPU 的核數。

可以使用 fit 函式擬合,使用 predict 函式預測

4、模型評估指標

之前對模型做評估時,通常採用的是準確率 (accuracy),它指的是分類器正確分類的樣本數與總體樣本數之間的比例。這個指標對大部分的分類情況是有效的,不過當分類結果嚴重不平衡的時候,準確率很難反應模型的好壞。

5、精確度和召回率(不平衡資料衡量指標)

資料預測的四種情況:TP、FP、TN、FN。
我們用第二個字母 P 或 N 代表預測為正例還是負例,P 為正,N 為負。
第一個字母 T 或 F 代表的是預測結果是否正確,T 為正確,F 為錯誤。
所以四種情況分別為:
TP:預測為正,判斷正確;
FP:預測為正,判斷錯誤;
TN:預測為負,判斷正確;
FN:預測為負,判斷錯誤;
我們知道樣本總數 =TP+FP+TN+FN,預測正確的樣本數為 TP+TN,
因此準確率 Accuracy = (TP+TN)/(TP+TN+FN+FP)。實際上,對於分類不平衡的情況,有兩個指標非常重要,它們分別是精確度和召回率。

  • 精確率 P = TP/ (TP+FP),對應上面恐怖分子這個例子,在所有判斷為恐怖分子的人數中,真正是恐怖分子的比例。
  • 召回率 R = TP/ (TP+FN),也稱為查全率。代表的是恐怖分子被正確識別出來的個數與恐怖分子總數的比例。
  • F1 作為精確率 P 和召回率 R 的調和平均,數值越大代表模型的結果越好
    在這裡插入圖片描述

6、案例分析:

1、資料介紹:資料集包括2013年9月份兩天內信用卡交易資料,284807筆交易中,有492筆欺詐行為,資料一共包括28個特徵,以及對應的交易時間和交易金額,28個特徵是按照 PCA變換得到的,欄位 class代表 該 筆交易的分類,1代表欺詐,0代表正常。
2、分析目的:針對資料集構建一個用於欺詐分析的分類器,採用邏輯迴歸。由於欺詐資料只佔總資料492/284807=0.172%,因此資料機器不平衡,不能使用準確率來評估模型的好壞,需要使用F1值(綜合準確率和召回率)。
3、分析流程:載入資料——準備階段(探索資料,資料規範化,特徵選擇,資料集劃分)——分類階段(建立分類器,模型訓練,模型評估和視覺化展示)
4、具體程式碼實現:

# -*- coding:utf-8 -*-
# 使用邏輯迴歸對信用卡欺詐進行分類
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import itertools
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_recall_curve
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
 
# 混淆矩陣視覺化
def plot_confusion_matrix(cm, classes, normalize = False, title = 'Confusion matrix"', cmap = plt.cm.Blues) :
    plt.figure()
    plt.imshow(cm, interpolation = 'nearest', cmap = cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation = 0)
    plt.yticks(tick_marks, classes)
 
    thresh = 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] > thresh else 'black')
 
    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.show()
 
# 顯示模型評估結果
def show_metrics():
    tp = cm[1,1]
    fn = cm[1,0]
    fp = cm[0,1]
    tn = cm[0,0]
    print('精確率: {:.3f}'.format(tp/(tp+fp)))
    print('召回率: {:.3f}'.format(tp/(tp+fn)))
    print('F1值: {:.3f}'.format(2*(((tp/(tp+fp))*(tp/(tp+fn)))/((tp/(tp+fp))+(tp/(tp+fn))))))
# 繪製精確率-召回率曲線
def plot_precision_recall():
    plt.step(recall, precision, color = 'b', alpha = 0.2, where = 'post')
    plt.fill_between(recall, precision, step ='post', alpha = 0.2, color = 'b')
    plt.plot(recall, precision, linewidth=2)
    plt.xlim([0.0,1])
    plt.ylim([0.0,1.05])
    plt.xlabel('召回率')
    plt.ylabel('精確率')
    plt.title('精確率-召回率 曲線')
    plt.show();
 
# 資料載入
data = pd.read_csv('./creditcard.csv')
# 資料探索
print(data.describe())
# 設定plt正確顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 繪製類別分佈
plt.figure()
ax = sns.countplot(x = 'Class', data = data)
plt.title('類別分佈')
plt.show()
# 顯示交易筆數,欺詐交易筆數
num = len(data)
num_fraud = len(data[data['Class']==1]) 
print('總交易筆數: ', num)
print('詐騙交易筆數:', num_fraud)
print('詐騙交易比例:{:.6f}'.format(num_fraud/num))
# 欺詐和正常交易視覺化
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(15,8))
bins = 50
ax1.hist(data.Time[data.Class == 1], bins = bins, color = 'deeppink')
ax1.set_title('詐騙交易')
ax2.hist(data.Time[data.Class == 0], bins = bins, color = 'deepskyblue')
ax2.set_title('正常交易')
plt.xlabel('時間')
plt.ylabel('交易次數')
plt.show()
# 對Amount進行資料規範化
data['Amount_Norm'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))
# 特徵選擇
y = np.array(data.Class.tolist())
data = data.drop(['Time','Amount','Class'],axis=1)
X = np.array(data.as_matrix())
# 準備訓練集和測試集
train_x, test_x, train_y, test_y = train_test_split (X, y, test_size = 0.1, random_state = 33)
 
# 邏輯迴歸分類
clf = LogisticRegression()
clf.fit(train_x, train_y)
predict_y = clf.predict(test_x)
# 預測樣本的置信分數
score_y = clf.decision_function(test_x)  
# 計算混淆矩陣,並顯示
cm = confusion_matrix(test_y, predict_y)
class_names = [0,1]
# 顯示混淆矩陣
plot_confusion_matrix(cm, classes = class_names, title = '邏輯迴歸 混淆矩陣')
# 顯示模型評估分數
show_metrics()
# 計算精確率,召回率,閾值用於視覺化
precision, recall, thresholds = precision_recall_curve(test_y, score_y)
plot_precision_recall()

輸出:

Time            V1            V2            V3            V4  \
count  284807.000000  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05   
mean    94813.859575  3.919560e-15  5.688174e-16 -8.769071e-15  2.782312e-15   
std     47488.145955  1.958696e+00  1.651309e+00  1.516255e+00  1.415869e+00   
min         0.000000 -5.640751e+01 -7.271573e+01 -4.832559e+01 -5.683171e+00   
25%     54201.500000 -9.203734e-01 -5.985499e-01 -8.903648e-01 -8.486401e-01   
50%     84692.000000  1.810880e-02  6.548556e-02  1.798463e-01 -1.984653e-02   
75%    139320.500000  1.315642e+00  8.037239e-01  1.027196e+00  7.433413e-01   
max    172792.000000  2.454930e+00  2.205773e+01  9.382558e+00  1.687534e+01   

                 V5            V6            V7            V8            V9  \
count  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05   
mean  -1.552563e-15  2.010663e-15 -1.694249e-15 -1.927028e-16 -3.137024e-15   
std    1.380247e+00  1.332271e+00  1.237094e+00  1.194353e+00  1.098632e+00   
min   -1.137433e+02 -2.616051e+01 -4.355724e+01 -7.321672e+01 -1.343407e+01   
25%   -6.915971e-01 -7.682956e-01 -5.540759e-01 -2.086297e-01 -6.430976e-01   
50%   -5.433583e-02 -2.741871e-01  4.010308e-02  2.235804e-02 -5.142873e-02   
75%    6.119264e-01  3.985649e-01  5.704361e-01  3.273459e-01  5.971390e-01   
max    3.480167e+01  7.330163e+01  1.205895e+02  2.000721e+01  1.559499e+01   

       ...           V21           V22           V23           V24  \
count  ...  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05   
mean   ...  1.537294e-16  7.959909e-16  5.367590e-16  4.458112e-15   
std    ...  7.345240e-01  7.257016e-01  6.244603e-01  6.056471e-01   
min    ... -3.483038e+01 -1.093314e+01 -4.480774e+01 -2.836627e+00   
25%    ... -2.283949e-01 -5.423504e-01 -1.618463e-01 -3.545861e-01   
50%    ... -2.945017e-02  6.781943e-03 -1.119293e-02  4.097606e-02   
75%    ...  1.863772e-01  5.285536e-01  1.476421e-01  4.395266e-01   
max    ...  2.720284e+01  1.050309e+01  2.252841e+01  4.584549e+00   

                V25           V26           V27           V28         Amount  \
count  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05  284807.000000   
mean   1.453003e-15  1.699104e-15 -3.660161e-16 -1.206049e-16      88.349619   
std    5.212781e-01  4.822270e-01  4.036325e-01  3.300833e-01     250.120109   
min   -1.029540e+01 -2.604551e+00 -2.256568e+01 -1.543008e+01       0.000000   
25%   -3.171451e-01 -3.269839e-01 -7.083953e-02 -5.295979e-02       5.600000   
50%    1.659350e-02 -5.213911e-02  1.342146e-03  1.124383e-02      22.000000   
75%    3.507156e-01  2.409522e-01  9.104512e-02  7.827995e-02      77.165000   
max    7.519589e+00  3.517346e+00  3.161220e+01  3.384781e+01   25691.160000   

               Class  
count  284807.000000  
mean        0.001727  
std         0.041527  
min         0.000000  
25%         0.000000  
50%         0.000000  
75%         0.000000  
max         1.000000  

[8 rows x 31 columns]

在這裡插入圖片描述
總交易筆數: 284807
詐騙交易筆數: 492
詐騙交易比例:0.001727

在這裡插入圖片描述
在這裡插入圖片描述
精確率: 0.841
召回率: 0.617
F1值: 0.712
在這裡插入圖片描述

相關文章