資料探勘—邏輯迴歸分類—信用卡欺詐分析
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
相關文章
- 信用卡欺詐行為邏輯迴歸資料分析-大資料ML樣本集案例實戰邏輯迴歸大資料
- 資料探勘從入門到放棄(一):線性迴歸和邏輯迴歸邏輯迴歸
- 分類演算法-邏輯迴歸與二分類演算法邏輯迴歸
- COMP 330正則化邏輯迴歸分類邏輯迴歸
- 三、邏輯迴歸logistic regression——分類問題邏輯迴歸
- 分類演算法(1)-LR邏輯迴歸演算法邏輯迴歸
- 邏輯迴歸邏輯迴歸
- 金融欺詐資料分析
- 從零開始利用Python建立邏輯迴歸分類模型Python邏輯迴歸模型
- Python邏輯迴歸Python邏輯迴歸
- 邏輯迴歸模型邏輯迴歸模型
- 線性迴歸與邏輯迴歸邏輯迴歸
- 邏輯迴歸求解二分類問題以及SPSS的實現邏輯迴歸SPSS
- 機器學習筆記-多類邏輯迴歸機器學習筆記邏輯迴歸
- 邏輯迴歸演算法邏輯迴歸演算法
- 對比線性迴歸、邏輯迴歸和SVM邏輯迴歸
- 基於邏輯迴歸及隨機森林的多分類問題資料分析-大資料ML樣本集案例實戰邏輯迴歸隨機森林大資料
- tf.keras實現邏輯迴歸和softmax多分類Keras邏輯迴歸
- Deep Learning Tutorial (翻譯) 之使用邏輯迴歸分類手寫數字MNIST邏輯迴歸
- Stripe如何解決信用卡欺詐? - Patrick
- 機器學習(六):迴歸分析——鳶尾花多變數回歸、邏輯迴歸三分類只用numpy,sigmoid、實現RANSAC 線性擬合機器學習變數邏輯迴歸Sigmoid
- 機器學習 | 線性迴歸與邏輯迴歸機器學習邏輯迴歸
- 邏輯迴歸 損失函式邏輯迴歸函式
- 2.3 邏輯迴歸演算法邏輯迴歸演算法
- 4.邏輯迴歸(Logistic Regression)邏輯迴歸
- Tensorflow教程(前三)——邏輯迴歸邏輯迴歸
- 機器學習:邏輯迴歸機器學習邏輯迴歸
- 機器學習(三):理解邏輯迴歸及二分類、多分類程式碼實踐機器學習邏輯迴歸
- 機器學習演算法(一): 基於邏輯迴歸的分類預測機器學習演算法邏輯迴歸
- [譯] 使用 PyTorch 在 MNIST 資料集上進行邏輯迴歸PyTorch邏輯迴歸
- 迴歸分析類別
- 邏輯迴歸為什麼使用sigmod邏輯迴歸
- 機器學習之邏輯迴歸機器學習邏輯迴歸
- 機器學習整理(邏輯迴歸)機器學習邏輯迴歸
- 2.3邏輯迴歸損失函式邏輯迴歸函式
- 對數機率迴歸(邏輯迴歸)原理與Python實現邏輯迴歸Python
- 邏輯迴歸(Logistic Regression)原理及推導邏輯迴歸
- 從零開始學習邏輯迴歸邏輯迴歸