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