[DA45] 信用卡诈骗分析
一. 相關介紹
? ? (一) 類不平衡問題
? ? ? ??在機器學習分類任務中, 類別不平衡是指不同類別的訓練樣例數差別很大.
? ? ? ? 解決類不平衡問題的方法有過抽樣、欠抽樣、閾值移動和組合方法等, 一般來講后兩種方法的效果高于前兩種方法.?
? ? ? ? 更多詳細內容請查看百度百科:?類不平衡問題
? ? (二) 精確率 - 召回率曲線
? ? ? ? sklearn 中的 precision_recall_curve 函數可以通過預測值和真實值來計算精確率 - 召回率曲線.
? ? ? ? 該函數通過傳入樣本的真實類別模型預測樣本的置信分數, 返回精確率數組、召回率數組和對應的閾值數組,通過 matplot.pyplot 工具繪制曲線, 反應了不同概率閾值情況下的精確率和召回率.
? ? (三) ROC 曲線與 AUC?
? ? ? ??接受者操作特性曲線,?又稱為感受性曲線, 它是一種非常有效的模型評價方法, 可為選定臨界值給出定量提示. 將靈敏度設在縱軸, 1-特異性設置在橫軸, 就可以得出 ROC 曲線圖.
? ? ? ? 與精確率 - 召回率曲線類似, sklearn 中的?roc_curve 函數, 返回的是假正例率 fpr 數組、真正例率 tpr 數組和對應的閾值數組.?
? ? ? ? AUC?被定義為 ROC 曲線下與坐標軸圍成的面積, 它的大小與每種模型優劣密切相關, 反映分類器正確分類的統計概率.?由于ROC 曲線一般都處于 y = x 這條直線的上方, 所以 AUC 的取值范圍在0.5和1之間.
? 從AUC 判斷分類器(預測模型)優劣的標準:? (以下數據摘自百度百科)
-
AUC = 1,是完美分類器。
-
AUC = [0.85, 0.95], 效果很好
-
AUC = [0.7, 0.85], 效果一般
-
AUC = [0.5, 0.7],效果較低,但用于預測股票已經很不錯了
-
AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。
-
AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優于隨機猜測。
?
二. 數據分析?
? ? (一) 數據加載與探索
? ? ? ? 數據為2013年9月份兩天時間內的信用卡交易數據, 284807筆交易中只有492筆是欺詐行為, 由于數據分析的關注點為欺詐交易, 感興趣的主類占比較少, 屬于典型的類不平衡問題.
? ? ? ? 輸入數據一共包括了28個特征 V1 到 V28 對應的取值, 以及交易時間 Time 和交易金額 Amount. 為了保護數據隱私, 原始數據中?V1 到 V28 為 PCA 變換得到的結果. 另外字段 Class 代表該筆交易的分類, Class=0代表正常, Class=1代表欺詐. 數據中無缺失值.
正常交易數與欺詐交易數?
從圖中看出的類不平衡?
? ? (二) 數據預處理
? ? ? ?V1 - V28 的特征值都經過 PCA 的變換, Time 和 Amount 兩個字段還需要進行規范化. Time 字段和交易本身是否為欺詐交易無關, 因此不作為特征選擇, 所以只需要對 Amount 做數據規范化. 同時數據沒有專門的測試集, 需使用 train_test_split 對數據集進行劃分, 由于是欺詐交易數較少, 傳入參數?stratify=labels 確保欺詐交易與正常交易的比例一致.
? ? ? ? 相關代碼:
# 標準化 ss = StandardScaler() data['Amount'] = ss.fit_transform(data['Amount'].values.reshape(-1, 1))# 準備訓練集和測試集 labels = data['Class'].values features = data.drop(['Time', 'Amount', 'Class'], axis=1).values train_x, test_x, train_y, test_y = train_test_split(features, labels, test_size=0.1, stratify=labels)? ? (三) 建模與預測
? ? ? ? 使用邏輯回歸模型進行分類, 由于本次分析的關注點不在于類不平衡問題樣本數據的優化, 故直接使用第(二)步處理好的數據進行訓練與預測.
? ? ? ? 因為數據集存在類不平衡問題, 故不能使用一般的評價方式對模型進行評定, 在此使用了 f1得分、模型評價報告、混淆矩陣對模型進行了大致評估, 代碼與結果如下:
# 定義混淆矩陣可視化函數 def cm_plot(data_matrix):sns.heatmap(data_matrix, annot=True, fmt='d', cmap='Greens')ax = plt.gca()ax.xaxis.set_ticks_position('top') # x 軸刻度顯示在頂端ax.xaxis.set_label_position('top') # x 軸標簽顯示在頂端ax.spines['right'].set_color('none')ax.spines['bottom'].set_color('none')plt.ylabel('True label')plt.xlabel('Predicted label')plt.show()# 邏輯回歸分類 clf = LogisticRegression() clf.fit(train_x, train_y) predict_y = clf.predict(test_x)# f1得分 f1 = f1_score(test_y, predict_y) print('f1得分:', f1)# 模型評價 report = classification_report(test_y, predict_y) print(report)# 混淆矩陣 matrix = confusion_matrix(test_y, predict_y) cm_plot(matrix) f1 得分 與 模型評價報告 混淆矩陣可視化?
? ? ? ? 從混淆矩陣中可以看出, 測試集中有正常交易 (28430 + 2) 例, 欺詐交易 (16 + 33) 例, 有 2 例正常的交易被模型誤判為欺詐交易, 有 16 例欺詐交易被模型誤判為了正常交易.
? ? ? ? 精確率 P = TP / (TP + FP) = 33 / (33 + 2) = 0.94
? ? ? ? 召回率?R = TP / (TP + FN) = 33 / (33 + 16)? = 0.67
? ? ? ? f1 得分為 0.79
? ? (四) 曲線繪制
? ? ? ? 繪制精確率 - 召回率曲線與 ROC 曲線, 再通過兩種方法計算 ROC 曲線的 AUC 值.
? ? 相關代碼:
# 定義曲線函數 def curve_plot(x_data, y_data, x_label, y_label, title_name):plt.plot(x_data, y_data, linewidth=2)plt.fill_between(x_data, y_data, step='post', alpha=0.2, color='b')plt.title(title_name)plt.xlabel(x_label)plt.ylabel(y_label)plt.xlim(0, 1.05)plt.ylim(0, 1.05)plt.show()# 樣本的置信分數 score_y = clf.decision_function(test_x)# 精確率-召回率 曲線 precision, recall, thresholds1 = precision_recall_curve(test_y, score_y) curve_plot(precision, recall, '精確率', '召回率', '精確率-召回率 曲線')# ROC 曲線 fpr, tpr, thresholds2 = roc_curve(test_y, score_y) curve_plot(fpr, tpr, '假正例率', '真正例率', 'ROC 曲線')# 計算 AUC print('AUC_1:', roc_auc_score(test_y, score_y)) print('AUC_2:', auc(fpr, tpr))? ? ? ??
?
?
? ? ? ? 由計算得?AUC 值為 0.96 , 對比百度百科的 AUC 評判優劣標準, 該邏輯回歸分類器屬于比較好的分類器.
? ? ? ? 但是從混淆矩陣上看, 分類器的精確率雖然較高, 但是召回率并不理想, 而且從精確率 - 召回率曲線上看, 閾值移動可提高召回率, 但精確率的犧牲也比較大, 為了解決這種類不平衡問題, 還是需要考慮使用更好的方法, 在此不做進一步分析.
?
?
總結
以上是生活随笔為你收集整理的[DA45] 信用卡诈骗分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MaixPY 教程】用mixly玩转k
- 下一篇: 移动游戏性能优化建议与字体剥离精简工具