信用卡交易数据异常检测

目录

一、案例背景以及数据集

二、代码

1、导入库,导入数据集。

2、数据标准化

3、下采样

4、划分训练集、测试集

5、建立模型,交叉验证

6、原始训练集预测效果

7、下采样训练集预测效果

8、绘制混淆矩阵

9、predict_proba自定义阈值

10、SMOTE

11、使用SVM分类

三、总结


一、案例背景以及数据集

信用卡欺诈是指以非法占有为目的,故意使用伪造、作废的信用卡,冒用他人的信用卡骗取财物,或用本人信用卡进行恶意透支的行为。

数据集“creditcard.csv”中的数据来自2013年9月由欧洲持卡人通过信用卡进行的交易。共284807行交易记录,其中数据文件中Class==1表示该条记录是欺诈行为,总共有 492 笔。输入数据中存在 28 个特征 V1,V2,……V28(通过PCA变换得到,不用知道其具体含义),以及交易时间 Time 和交易金额 Amount。

百度云链接:https://pan.baidu.com/s/1_GLiEEqIZqXVG7M1lcnewg
提取码:abcd

目标:构建一个信用卡欺诈分析的分类器。通过以往的交易数据分析出每笔交易是否正常,是否存在盗刷风险。

二、代码

1、导入库,导入数据集。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as npdata = pd.read_csv("creditcard.csv")
data.head()
pd.value_counts(data['Class'], sort = True)

从运行结果可以看出,正常记录有284315条,而欺诈行为记录只有492条,后者占总数的0.2%不到,说明样本数据极度不均衡。也就是说,只要生成一个永远把样本预测为反例的分类器,准确率就可以达到99.8%了,可是这样的分类器没有丝毫意义,因为它不能预测出任何正例。

那么如何解决数据类别不平衡问题呢?就是要让标签值(如0和1分类)中的样本数据量大致相同。

常用的方法有:

(1)、过采样(oversampling the minority)。即以数据量多的一方的样本数量为标准,把样本数量较少的类的样本数量生成和样本数量多的一方相同。SMOTE也是一种过采样方法,其基本思想是对少数类样本进行分析,并根据少数类样本人工合成新样本添加到数据集中。即以每个少数类样本点的k个最近邻样本点为依据,随机的选择N个邻近点进行差值并乘上一个[0,1]范围的随机因子,从而达到合成数据的目的。(两种样本数量一样多)

(2)、欠采样(under-sampling the majority)。即以数据量少的一方的样本数量为准,从分类样本多的数据从随机抽取等量的样本。(两种样本数量一样少)

2、数据标准化

可以观察特征V28的数值浮动较小。而特征Amount的值分布差异较大,如果不经处理直接拿来训练,学习系统会认为Amount的值越大,其重要程度就越大。为消除数据特征之间的量纲影响,使得各特征重要程度相当,就要对数据进行标准化处理。

数据标准化(Normalization),即将数据值缩放成均值为0,方差为1的状态。

x'=\frac{x-\mu }{\sigma }

\mu\sigma分别是样本数据的均值(mean)和标准差(std)。

from sklearn.preprocessing import StandardScaler #标准化模块data['normAmount'] = StandardScaler().fit_transform(data.Amount.values.reshape(-1, 1))  
data = data.drop(['Time','Amount'],axis=1)  #删除不需要的列
data.head()

3、下采样

即使得Class列中,值为0、1的数据量一样少。

X = data.iloc[:, data.columns != 'Class'] #特征数据
y = data.iloc[:, data.columns == 'Class'] #标签数据number_records_fraud = len(data[data.Class == 1])     #异常样本数量
fraud_indices = data[data.Class == 1].index           #得到所有异常样本的索引
normal_indices = data[data.Class == 0].index          #得到所有正常样本的索引# 在正常样本中随机采样
random_normal_indices = np.random.choice(normal_indices, number_records_fraud, replace = False)# 根据索引得到下采样所有样本
under_sample_data = data.iloc[np.concatenate([fraud_indices,random_normal_indices]),:]
X_undersample = under_sample_data.iloc[:, under_sample_data.columns != 'Class']  #特征数据
y_undersample = under_sample_data.iloc[:, under_sample_data.columns == 'Class']  #标签数据pd.value_counts(under_sample_data['Class'], sort = True) #观察数据

最终从284315条正常样本中取出492条样本数据,下采样的缺点是对样本数据利用率低,大多数数据并没有被用到。

4、划分训练集、测试集

利用train_test_split函数随机的将样本数据分为两部分。然后用训练集来训练模型,在测试集上验证模型及参数。参数test_size设为0.3表示分成70%的训练集,30%的测试集。参数random_state设置为0表示每次随机划分的结果都是一样的,可以控制数据避免产生不必要的变化。

from sklearn.model_selection import train_test_split# 对原始数据集进行划分
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)
len(X_train)  #原始训练集包含样本数量
len(X_test)   #原始测试集包含样本数量# 对下采样数据集进行划分
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_undersample,y_undersample,test_size = 0.3,random_state = 0)
len(X_train_undersample)  #下采样训练集包含样本数量
len(X_test_undersample)   #下采样测试集包含样本数量

5、建立模型,交叉验证

逻辑回归模型是机器学习中最常用最经典的分类方法之一,常用于处理分类问题。在这里使用逻辑回归模型来训练,最终通过sigmoid函数得到一个概率值,大于0.5就说明风险较高,判定是正例。小于0.5,就说明是欺诈行为的可能性较低。

L1正则化可以看做是损失函数的惩罚项,可产生稀疏权值矩阵,即产生一个稀疏模型用于特征选择(在这个项目中有29个特征,可是各特征对模型的贡献度是不一样的,有的特征贡献大,有的特征贡献小)。

带L1正则化项的损失函数就是在原来的损失函数基础上加上权重参数的绝对值:\alpha \cdot \sum_{w}^{}|w|。其中,α是正则化系数,通过控制α来调整惩罚力度,在本项目中取为0.01。

在前面有说过本项目由于样本数据不均衡,故而用准确率(Accuracy)来评估模型不太妥善,所以选择用召回率(Recall)来评估模型:

Recall=\frac{TP}{TP+FN}

其中,TP(True Positives)表示:正例样本通过模型被判定为正例。FN(False Negatives)表示:正例样本通过模型被判定为负例。

而准确率是正例样本被判定为正例,负例样本被判定为负例,占总体样本的比例。

若将样本数据简单划分为训练集和测试集。测试集是与训练独立的数据,只被用于最终模型的评估。如此评估模型时,经常会出现过拟合的问题,即模型在训练数据上表现好,却在测试数据上表现差。所以通常在训练数据中分出一部分做为验证数据,用来评估模型的训练效果。验证数据取自训练数据,但不参与训练,就可以相对客观的评估模型对于训练集之外数据的预测效果。

在此处使用K折交叉验证,取K=5,即将训练集分成5份,每个子集数据依次成为验证集,同时其余4组子集数据作为训练集。这样一共要循环5次,验证5次,并得到5个模型,对其误差计算均值,即得到交叉验证误差。

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold
from sklearn.metrics import confusion_matrix,recall_scoredef printing_Kfold_scores(x_train_data,y_train_data):# k-fold表示K折的交叉验证,会得到两个索引集合: 训练集 = indices[0], 验证集 = indices[1]fold = KFold(5,shuffle=False) recall_accs = []for iteration, indices in enumerate(fold.split(x_train_data)): # 实例化算法模型,指定l1正则化lr = LogisticRegression(C = 0.01, penalty = 'l1',solver='liblinear')# 训练模型,传入的是训练集,所以X和Y的索引都是0lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())# 建模后,预测模型结果,这里用的是验证集,索引为1y_pred_undersample = lr.predict(x_train_data.iloc[indices[1],:].values)# 评估召回率,需要传入真实值和预测值recall_acc = round(recall_score(y_train_data.iloc[indices[1],:].values,y_pred_undersample),4)recall_accs.append(recall_acc)print('第', iteration+1,'次迭代:召回率 = ', recall_acc)# 当执行完交叉验证后,计算平均结果print('平均召回率 ', round(np.mean(recall_accs),4))return None

6、原始训练集预测效果

printing_Kfold_scores(X_train,y_train)
输出结果:
第 1 次迭代:召回率 =  0.4925
第 2 次迭代:召回率 =  0.6027
第 3 次迭代:召回率 =  0.6833
第 4 次迭代:召回率 =  0.5692
第 5 次迭代:召回率 =  0.45
平均召回率  0.5595

可以看出,在原始训练集上,并没有能很好地预测出正例。

7、下采样训练集预测效果

printing_Kfold_scores(X_train_undersample,y_train_undersample)

输出结果:

第 1 次迭代:召回率 =  0.9589
第 2 次迭代:召回率 =  0.9452
第 3 次迭代:召回率 =  1.0
第 4 次迭代:召回率 =  0.973
第 5 次迭代:召回率 =  0.9697
平均召回率  0.9694

可以看出,在下采样训练集上,对于正例的预测效果比较不错。

8、绘制混淆矩阵

混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种用来可视化呈现算法性能的特定矩阵,每一列代表预测值,每一行代表的是实际的类别即真实值。

混淆矩阵

Predicted label

True label

01
0True Negatives(TN,真实反例被预测为反例)False Positives(FP,真实反例被预测为正例,即“存伪”)
1False Negatives(FN,真实正例被预测为反例,即“去真”)True Positives(TP,真实正例被预测为正例)
import itertoolsdef plot_confusion_matrix(cm, classes,title='Confusion matrix',cmap=plt.cm.Blues):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')#下采样训练集训练之后,预测原始测试集
lr = LogisticRegression(C = 0.01, penalty = 'l1',solver='liblinear')
lr.fit(X_train_undersample,y_train_undersample.values.ravel())
y_pred = lr.predict(X_test.values)
print("召回率: ", recall_score(y_test.values, y_pred))# 绘制混淆矩阵
plot_confusion_matrix(confusion_matrix(y_test,y_pred) ,[0,1])

从绘制的混淆矩阵可以看出FP的数量过大,存在很多“误伤”的现象,即将10357条正常数据判定成了欺诈行为。准确率不高,Recall值却还不错。

9、predict_proba自定义阈值

为缓解上面“误伤”的现象,可以自定义判定概率阈值。即使得对异常数据的判定更“严格”一些。使用predict()函数预测时,最终分类的概率大于0.5即被认为是欺诈行为。可以使用predict_proba()函数来自定义一个阈值,如0.6。随着阈值增大,召回率会越低。

y_pred_proba = lr.predict_proba(X_test.values)
y_classify = y_pred_proba[:,1] > 0.6print("召回率: ", recall_score(y_test.values, y_classify))
plot_confusion_matrix(confusion_matrix(y_test,y_classify), [0,1]) 

 可以看出,在阈值设定为0.6时,召回率和准确率都还不错。

10、SMOTE

使用SMOTE算法将训练集中异常数据生成到与正常数据一样多,从345变为199019条,从而解决样本数据不均衡问题。

from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifieroversampler=SMOTE(random_state=0)
os_data,os_labels=oversampler.fit_resample(X_train,y_train)
pd.value_counts(os_labels.Class)lr = LogisticRegression(C = 0.01, penalty = 'l1',solver='liblinear')
lr.fit(os_data,os_labels.values.ravel())
os_pred = lr.predict(X_test.values)print("召回率: ", recall_score(y_test.values, os_pred))
plot_confusion_matrix(confusion_matrix(y_test,os_pred) ,[0,1])

 可以看出,使用SMOTE算法过采样要比下采样的效果更好一些。

11、使用SVM分类

from sklearn import svm
s=svm.SVC(kernel='linear')
s.fit(X_train_undersample,y_train_undersample.values.ravel())
y_pred_svm=s.predict(X_test.values)
print("召回率: ", recall_score(y_test.values, y_pred_svm))
plot_confusion_matrix(confusion_matrix(y_test,y_pred_svm) ,[0,1])

 可以看出,线性SVM模型效果略优于逻辑回归模型。

三、总结

1、首先要对数据文件进行检查,观察特征和标签,从而进行数据标准化、填充空值、类型转换、下采样、过采样等相应操作。

2、选择合适的模型来训练,会使得预测结果有不一样的效果。

3、可以用不同的指标来进行模型评估,还可以通过可视化手段来更好地呈现模型分类效果。

参考:唐宇迪老师python数据分析与机器学习实战课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/69058.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最近接触的几种APP支付方式——信用卡支付AuthorizeNet

同样基于.net core webapi ,对外暴露支付接口 1.nuget添加引用:AuthorizeNet 里面的方法大家不妨都了解下,方便自己功能调用。 核心代码直接贴出,仅供参考 var transactionRequestType new transactionRequestType { poNumber $&…

信用卡欺诈检测

信用卡欺诈检测 信用卡欺诈检测是kaggle上一个项目,数据来源是2013年欧洲持有信用卡的交易数据,详细内容见https://www.kaggle.com/mlg-ulb/creditcardfraud 这个项目所要实现的目标是对一个交易预测它是否存在信用卡欺诈,和大部分机器学习项…

Thinkphp使用Authorize.Net实现VISA信用卡支付

官方网站:https://developer.authorize.net/ 开发者文档:https://developer.authorize.net/api/reference/index.html 一、注册沙箱账号进行调试 注册成功之后会弹出你的沙箱账号信息 API LOGIN ID 48h4xxxxxePS TRANSACTION KEY 4S9xxxxxxxxxx8Aq K…

4款好用的PC端电子书阅读软件,千万别错过

分享4款好用的电子书阅读软件,支持多种电子书格式阅读,并且阅读界面舒适可随意调整,大家快去试试吧! 1、百度阅读器精简版 支持阅读的格式:TXT、PDF 一个百度推出的电子书阅读软件,简单小巧,…

GitBook制作epub电子书,并上传到微信读书

目标:将一本 GitBook(SpringBoot2 中文参考指南)转换为 epub 电子书,放到微信读书里。 准备工作:Windows 10 X64,NodeJS及版本管理工具nvm、Chrome浏览器 步骤一:打开 https://jack80342.gitbo…

学生党福音 电子教材下载网站推荐

还在购买电子教材?这几个电子教材下载网站可以免费下载下载教材,一起来看看吧。 1.中小学数字教材一站式下载 一个包含小学和中学教科书的网站。从小学一年级到高中三年级的教科书均包括在内。支持在线查看和下载,下载格式为PDF。我们可以滑…

信息时代,为什么还读纸质书

后人进步,是因为脚踩先人的脚印,这是知识进步最重要的途径之一。 唐僧取经,历经千山万水也要把真经取回来,取回来,再翻译,再传播;中国古代四大发明之造纸术、印刷术,承载了古代劳动…

Kindle下线在即 使用cpolar建立自己的电子书图书馆

在电子书风靡的时期,大部分人都购买了一本电子书,虽然这本电子书更多的时候是被搁置在储物架上吃灰,或者成为盖泡面的神器,但当亚马逊发布消息将放弃电子书在中国的服务时,还是有些令人惋惜,毕竟谁也不想大…

推荐一些可以获取免费的国外的原版书籍(电子版)网站

Z-library 推荐指数:★★★★★ 网站:https://z-lib.org/ 这个网站据称是世界最大的电子图书馆,收藏的资源包含725万本书、8075万的文献条目,可以说是相当丰富了。 网站支持中文搜索,不过注册登录就可以直接下载电子书…

彻底凉了!全球最大电子书网站遭封站

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 前几天,号称是世界上最大的免费电子图书馆 Z-Library,被美国查封,相关的数个域名全部无法访问! 根据 DNS 记录和其他信息显示&#x…

2023年最值得关注的十大科技趋势,这些技术将迎来爆发,把握住风口和掘金机会!

1 月 11 日,InfoQ获悉,达摩院 2023 十大科技趋势发布,生成式 AI、Chiplet 模块化设计封装、全新云计算体系架构等技术入选。 达摩院发布十大科技趋势 达摩院认为,全球科技日趋显现出交叉融合发展的新态势,尤其在信息与…

爆火论文打造《西部世界》雏形:25个AI智能体,在虚拟小镇自由成长

机器之心报道 机器之心编辑部 《西部世界》的游戏逐渐走进现实。 我们能否创造一个世界?在那个世界里,机器人能够像人类一样生活、工作、社交,去复刻人类社会的方方面面。 这种想象,曾在影视作品《西部世界》的设定中被完美地还原…

Android 添加App快捷方式到桌面

原创文章,如有转载,请注明出处:http://blog.csdn.net/myth13141314/article/details/68926849 主要原理是通过向系统发送创建快捷方式的广播 设置Intent,传递快捷方式的信息,名字和图标等 Intent shortcut new Int…

如何把一个网页设置快捷方式放到桌面上去,或者手机桌面当App一样使用

分别讲电脑端和手机端: 电脑端: 在尝试好几种方式后,还是觉得最最简单的方法,还是用电脑自带的方式不借助任何外力方便,利用谷歌的方式也讲一下哈(利用谷歌会有自己的图标这点不错); 其他方式: https://zh.wikihow.com/%E6%8A%8A%E7%BD%91%E7%AB%99%E7%9A%84%E5%BF%AB%E6%8D…

给你的AppImage创建桌面快捷方式

运行环境:Ubuntu 22.04 LTS 1.首先准备好AppImage文件并放在一个你知道的地方 2.打开终端,在/usr/share/applications下新建APP.desktop文件(APP可以改成你的应用名称) cd /usr/share/applications sudo touch APP.desktop 3. root模式下使用vi编辑qi编辑APP.deskto…

iPhone苹果手机如何将百度小程序添加到手机桌面方便使用?

苹果iPhone手机将百度小程序添加到手机桌面后,下次使用直接可以在iPhone苹果手机桌面找到像APP一样的图标,点击直接打开百度小程序方便使用; 如何将百度小程序添加到手机桌面方便使用? 1、打开手机百度APP,搜索要添加…

iOS 添加快捷方式到主屏幕

参考文章: iOS 添加到主屏幕/ iOS Add To Desktop iOS创建桌面快捷方式代码 在上面文章和其他资料基础上实现此功能,详细介绍和技术点可参考上述文章。Demo是以第三方CocoaHTTPServer为基础,建立本机服务器,调起Safari创建快…

OpenAI 直播大秀语音指挥 AI 自动编程

本文转载自IT之家 刚刚,OpenAI 又玩出了一个新高度。 只输入自然语句,AI 就自动做了个小游戏! 划重点:不! 用! 你! 编! 程! 来,感受一下这个 feel。 第一…

直播预告 | 腾讯云工业AI系列直播

随着工业革命的不断推进,人工智能等新技术新理念在各行业兴起。同时,各行业也逐步向数字化、智能化、自动化转型,进入现代化工业新阶段。 工业质检是整个制造中一个非常重要的环节,但工业AI质检的有效落地是我们面临的一个巨大挑…

Steam教育对儿童在幼儿园阶段概念理解

孩子对有关科学领域的探究和学习,往往受到好奇心和兴趣的直接驱使,少儿编程就是从这一点出发,来培养孩子的科学思维与能力的。具体而言,少儿编程是怎样助力培养孩子的科学素养呢? 增强孩子处理信息的能力。现实中充斥着…