目录

  • 一、案例背景
  • 二、算法评价指标
    • 2.1 准确率
    • 2.2 ROC曲线
  • 三、模型建立
    • 3.1 数据来源
    • 3.2 数据读取
    • 3.3 因素分析
      • 3.3.1 交易时间
      • 3.3.2 交易金额
      • 3.3.3 其他
    • 3.4 模型建立
      • 3.4.1 逻辑回归模型
      • 3.4.2 随机森林模型
      • 3.4.3 SVM模型
  • 四、模型预测

一、案例背景

信用卡虚假交易是指通过不存在的、伪造变更的实体商品或服务交易,来套取信用卡内资金的违法行为。

信用卡虚假交易识别先后经历了人工甄别、规则判断和大数据人工智能识别三个阶段。随着计算机和网络通信技术的发展,目前,虚假交易已进入大数据人工智能识别阶段。

大数据人工智能借助信用卡交易记录的大数据和飞速发展的数据挖掘算法,能够发现可疑的虚假交易,遏制违法行为。其流程如下:

首先是对原始业务记录数据进行清洗,得到满足算法输入要求的训练集数据,包括算法训练集属性和分类标签;然后选择合适的数据挖掘算法进行模型训练及参数调优;训练好的算法模型可以用来对新数据进行分类预测,判断交易是否为虚假交易。

二、算法评价指标

要评价一个数据挖掘算法效果的好坏,必须有量化的评价指标

2.1 准确率

准确率:是最直观的评价指标,即被正确分类的样本数除以样本总数。如100个样本中,算法正确分类的样本数为90个,则准确率accuracy = 90/100 = 0.9

2.2 ROC曲线

在分类算法中,用ROC曲线下方与x轴之间的面积AUC(area under curve)作为评价算法优劣的指标更为常见。

假设分类算法的预测结果的分类可分为阳性(positive)和阴性(negative);预测结果的正确性可分为正确(true)和错误(false)。则预测标签与实际数据之间的关系有以下四种:TP(正确预测为阳性分类结果)、TN(正确预测为阴性分类结果)、FP(错误预测为阳性分类结果)、FN(错误预测为阴性分类结果)。如在100个样本中有阳性分类结果和阴性分类结果,在算法预测结果中TP = 40、FN = 20、FP = 10、TN = 30,根据计算可得出AUC = 0.7083,即为这个算法优劣的量化指标。

三、模型建立

3.1 数据来源

本案例数据来自于一个信用卡发卡机构,记录了信用卡刷卡活动数据,数据下载地址:https://www.kaggle.com/mlg-ulb/creditcardfraud

数据中除了交易时间(Time)、交易金额 (Amount)以及是否为虚假交易分类结果(Class)之外,还有28个关于交易信息的字段数据,由于涉及到商业秘密和客户隐私,分别用V1、V2、V3……表示。

3.2 数据读取

在导入相关工具包之后,我们首先读取信用卡数据来把握其基本情况

FraudDetction=pd.read_csv('creditcard.csv')
FraudDetction.info()


可以看出一共有284807个数据,且不存在空值,不需要进行特别的处理;

接着观察数据的基本情况:

最后,按照分类结果画出饼状图:

# 看看欺诈交易与正常交易的数据量对比
label_distr=pd.value_counts(FraudDetction['Class'],sort=True).sort_index()
# 统计欺诈与正常交易的总数
label_distr.value_counts()
#绘制饼图
label_distr.plot.pie(legend='True',colors=['b','w'],title='正常与欺诈用户分布\n0:正常 1:欺诈')
# plt.savefig('ch17_01.png',dpi=300,bbox_inches='tight')
plt.show()


可以看到正常与虚假交易之间数据量差距较大,在后续模型处理中需要注意!

3.3 因素分析

3.3.1 交易时间

首先观看正常交易/虚假交易量与交易时间之间的关系:

#查看正常/欺诈交易与交易时间的关系# 查看二者的描述性统计,与时间的序列分布关系
print('正常')
print(FraudDetction.Time[FraudDetction.Class == 0].describe())
print('-'*25)
print('欺诈')
print(FraudDetction.Time[FraudDetction.Class == 1].describe())


可以看出,无论是正常交易或者欺诈交易,除了其数据量有较大差异之外,其他描述性统计量数据大致一致,无较大差异;且两者与总的数据的描述情况也相差不大

f,(ax1,ax2)=plt.subplots(2,1,sharex=True,figsize=(12,6))
bins=100ax1.hist(FraudDetction.Time[FraudDetction.Class == 1],bins=bins)
ax1.set_title('欺诈(Fraud))',fontsize=22)
ax1.set_ylabel('交易量',fontsize=15)ax2.hist(FraudDetction.Time[FraudDetction.Class == 0],bins=bins)
ax2.set_title('正常(Normal)',fontsize=22)
ax2.set_ylabel('交易量',fontsize=15)plt.xlabel('时间(单位:秒)',fontsize=15)
plt.xticks(fontsize=15)print('交易量与时间的关系:')
# plt.savefig('ch17_02.png',dpi=300,bbox_inches='tight')
plt.show()

从柱状图分布中也无法看出两者分布有明显区别。

3.3.2 交易金额

同理,分析正常交易/虚假交易量与交易金额之间的关系:

同样,两者描述性统计量数据相差不大,其分布更是基本一致。

从以上两个交易信息因素的分析中来看,正常交易和虚假交易在交易时间、交易金额这两个维度上都没有表现出明显的不一致,并不能有效的区分真实交易与虚假交易。因此需要对其他28个属性进行逐个验证。

3.3.3 其他

接下来,我们对剩下的28个属性进行分析,观察正常交易和虚假交易之间的趋势是否一致,若属性与分类结果两个标签的关系曲线趋势差别大,则该属性的取值对是否为正常交易的区分更明显;否则该属性与“交易时间/交易金额”一样,无法明显区分是否为虚假交易。

对所有属性进行分析可以看到,有的属性分布直方图上,正常交易与虚假交易分布差别大,比如V16、V17;有的属性的分布直方图上,正常交易与虚假交易是重叠的,难以区分,如V25、V26等

因此,如果是只取部分属性数据作为虚假交易识别的训练集,则应当选用那些属性分布图在正常交易和虚假交易有明显区别的属性。

3.4 模型建立

首先,按照7:3的比例将数据分为训练集和测试集:

#导入日期时间包,用于算法训练时间分析
import datetime
#分别调用逻辑回归、随机森林、支持向量SVM三种Scikit内建的模型
#数据按7:3的比例生产训练和测试数据集分组
Fraud=FraudDetction[FraudDetction.Class == 1]
Normal=FraudDetction[FraudDetction.Class == 0]# 训练特征集
x_train=Fraud.sample(frac=0.7)
x_train=pd.concat([x_train,Normal.sample(frac=0.7)],axis=0)
# 测试特征集
x_test=FraudDetction.loc[~FraudDetction.index.isin(x_train.index)]# 标签集
y_train=x_train.Class
y_test=x_test.Class# 去掉特征集里的标签和时间列
x_train=x_train.drop(['Class','Time'],axis=1)
x_test=x_test.drop(['Class','Time'],axis=1)
# 查看数据结构
print('训练数据结构:',x_train.shape,y_train.shape)
print('测试数据结构:',x_test.shape,y_test.shape)

由于我们前面说到,数据中真实交易和虚假交易的数据量差别较大,所以在数据集划分时,应该按照分类标签划分训练集和测试集,避免正常/虚假交易在训练集和测试集中分布不均造成模型训练不精准。

3.4.1 逻辑回归模型

然后构造第一个模型,观察逻辑回归训练情况:

from sklearn import metrics
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (precision_recall_curve,auc,roc_auc_score,
roc_curve,recall_score,classification_report)#构造逻辑回归模型
lrmodel = LogisticRegression(penalty='l2')
#训练模型
start=datetime.datetime.now()
lrmodel.fit(x_train, y_train)
end=datetime.datetime.now()#查看混淆矩阵
ypred_lr=lrmodel.predict(x_test)
print('confusion_matrix')
print(metrics.confusion_matrix(y_test,ypred_lr))#查看预测精度与决策覆盖面
print('Accuracy:%f'%(metrics.accuracy_score(y_test,ypred_lr)))
print('Area under the curve:%f'%(metrics.roc_auc_score(y_test,ypred_lr)))
print('Runtime =',end-start)

根据前面划分的训练集,对构造的逻辑回归模型进行训练;训练结束后,用模型对测试集x_test进行预测,将预测结果与实际分类结果对比,可得出模型的混淆矩阵、准确率、AUC值和模型训练时间数据。

从输出结果来看,在(85279+16)个真实交易样本中,有16个样本被错误分类为虚假交易、在(49+99)个虚假交易样本中,有49个样本被错误分类为正常交易。

最后从绘制出的ROC曲线可以看出,模型在正常交易的区别上准确率较高,在虚假交易的区分上准确率较差。

3.4.2 随机森林模型

第二个训练的模型是随机森林模型,这个在以前的文章中已经多次使用到,就不细说了,具体看看前面决策树分类算法等文章,接下来我们直接训练模型:

from sklearn.ensemble import RandomForestClassifier#构造随机森林模型
rfmodel=RandomForestClassifier()
#训练模型
start=datetime.datetime.now()
rfmodel.fit(x_train,y_train)
end=datetime.datetime.now()#查看混淆矩阵
ypred_rf=rfmodel.predict(x_test)
print('confusion_matrix')
print(metrics.confusion_matrix(y_test,ypred_rf))#查看预测精度与决策覆盖面
print('Accuracy:%f'%(metrics.accuracy_score(y_test,ypred_rf)))
print('Area under the curve:%f'%(metrics.roc_auc_score(y_test,ypred_rf)))
print('Runtime =',end-start)


从训练结果来看,无论是TP、TN,还是AUC值都比逻辑回归表现得更好,但在我的运行环境中,随机森林模型训练的时间是最长的。

3.4.3 SVM模型

最后一个模型是SVM模型,即支持向量机(support vector machine)是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

from sklearn.svm import SVC#构造支持向量机模型
svcmodel=SVC(kernel='sigmoid')
#训练模型
start=datetime.datetime.now()
svcmodel.fit(x_train,y_train)
end=datetime.datetime.now()#查看混淆矩阵
ypred_svc=svcmodel.predict(x_test)
print('confusion_matrix')
print(metrics.confusion_matrix(y_test,ypred_svc))#查看预测精度与决策覆盖面
print('Accuracy:%f'%(metrics.accuracy_score(y_test,ypred_svc)))
print('Area under the curve:%f'%(metrics.roc_auc_score(y_test,ypred_svc)))
print('Runtime =',end-start)


从混淆矩阵来看,148个虚假交易样本中,正确识别的只有8个,错误识别的有140;其AUC值差不多为0.5,也就是和随便猜差不多了

四、模型预测

模型训练结束后,就可以使用模型进行训练,可以从测试集中随机选取一条记录,用三个训练好的模型对记录进行分类结果的预测:

#使用训练好的随机森林模型进行预测
#从x_test中抽取一条记录,作为模拟的新输入数据
new_input=x_test.iloc[10].values.reshape(1,-1)
new_output=y_test.iloc[10]
print("new_input=",new_input)
#实际分类结果
print("new_output=",new_output)
#使用逻辑回归模型对该数据进行预测
print("lrmodel prediction=",lrmodel.predict(new_input))
#使用随机森林模型对该数据进行预测
print("rfmodel prediction=",rfmodel.predict(new_input))
#使用支持向量机模型对该数据进行预测
print("SVCmodel prediction=",svcmodel.predict(new_input))


当尝试的次数足够多的时候,就会发现SVC模型容易出错,而随机森林模型预测的分类结果基本都正确。

结合模型训练部分来看,预测效果最好的是随机森林模型,训练时间最快的是逻辑回归模型,而支持向量机表现最差,大部分虚假交易都不能识别出来。

最后的最后,大家如果觉得文章不错的话,记得收藏、点赞、关注三连~
我会把相关数据和完整代码整理好上传到我的资源,大家也可以下载下来自己研究

【综合案例】信用卡虚拟交易识别相关推荐

  1. 【综合案例】信用评分模型开发

    目录 一.案例背景 二.前置知识 2.1 数据分箱 2.2 属性选择 2.3 回归方程 三.数据处理 3.1 数据清洗 3.2 因素分析 四.模型训练 五.模型预测 六.结语 后记 一.案例背景 在上 ...

  2. 【综合案例】网络贷款违约预测

    目录 一.案例背景 二.数据处理 2.1 选取数据 2.2 删除无效数据 2.3 分析属性关系 2.4 数据再处理 三.模型训练 3.1 分离训练集 3.2 模型训练 四.模型预测 一.案例背景 随着 ...

  3. 图解大数据 | 综合案例-使用Spark分析挖掘零售交易数据

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/84 本文地址:http://www.showmeai.tech/article-det ...

  4. jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例

    day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...

  5. 前端学习从入门到高级全程记录之8 (PS基本使用综合案例)

    本期学习目标 本期我们将学习PS的基本使用并且运用以前所学的CSS和HTML的技术来完成一个综合案例. 1.Photoshop基本使用 早在第一期我就让大家去安装PS,不知道安装了没有,没有安装的尽快 ...

  6. 92.最后的综合案例

    目录 1  综合案例介绍 2  注册模块 2.1  页面实现 2.1.1  控件大小不随布局管理器改变 2.1.2  想修改控件之间的间距 2.1.3  设置背景时将QWidget的子控件也设置成了相 ...

  7. 【Hadoop】四、Hadoop生态综合案例 ——陌陌聊天数据分析

    文章目录 四.Hadoop生态综合案例 --陌陌聊天数据分析 1.陌陌聊天数据分析案例需求 1.1.背景介绍 1.2.目标需求 1.3.数据内容 2.基于Hive数仓实现需求开发 2.1.建库建表.加 ...

  8. 8.3 综合案例2.0-扫码支付二维码生成

    综合案例2.0-扫码支付二维码生成 扫码支付完整流程 案例说明 1.硬件 2.连线图 搭建云平台环境 1.添加设备 2.创建设备类型 3.功能定义(创建物模型) 代码 1.更改MQTT信息 2.测试 ...

  9. 32.全网最详细trap讲解,trap语法格式,信号和用途,最常用的信号,trap常用的命令,ctrl + c,信号屏蔽和恢复,trap -,debug,exit,return示例,三个综合案例

    文章目录 语法详解 trap格式 信号和用途 最常用的信号 trap常用的命令 示例 ctrl + c 示例 信号屏蔽和恢复 trap - 示例 debug示例 exit示例 return示例 综合案 ...

最新文章

  1. python post提交数据
  2. linux加载虚拟sriov网卡,如何配置BroadCOM网卡的SR-IOV功能
  3. dev 报表设计器 怎么设置每页10行_可嵌入您系统的.NET 报表控件ActiveReports:带状列表组件...
  4. 团队管理---优秀管理者必须掌握的“七大秘诀”
  5. hibernate批量上传
  6. 解决CentOS中无法使用setup命令 -bash:setup: command
  7. 双击事件 转载 http://blog.sina.com.cn/s/blog_739365a30100vk8p.html
  8. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery2)
  9. html文本特效代码逐个出现,JS特效文字逐个显示
  10. 机器学习——算法介绍-4
  11. mac硬盘故障升级系统_硬件升级:如何安装新硬盘,第2页,故障排除
  12. mac安装软件提示没有权限
  13. Google Earth Engine(GEE)——全球12级流域矢量数据免费下载(含数据下载链接)
  14. P问题、NP问题、NPC问题、NP难问题的概念[zz]
  15. 关于Win10版本1903的蓝牙设备已配对但无法使用的结局方案
  16. linux作业控制 信号,bash中的作业控制机制
  17. 【计算机视觉与深度学习】全连接神经网络(一)
  18. [WARNING] The requested profile “pom.xml“ could not be activated because it does not exist.
  19. express 解析post请求的数据格式
  20. 学习要尽可能把心静下来

热门文章

  1. 万用表怎么测量电池容量_电工知识:用万用表怎么测量电车电池的好坏?简单分析5种耗电...
  2. ipad如何分屏_iPad手写笔记软件,首选notability
  3. 2023香港国际创科展开幕,欧科云链受邀参展
  4. linux 系统环境配置文件
  5. 【CVPR 2021】自我知识蒸馏:Self-distillation with Batch Knowledge Ensembling Improves ImageNet Classification
  6. html js 图片放大效果,JavaScript实现图片放大预览效果
  7. qt QPF 字体各个字段的意义
  8. STM32CubeMX系列|红外遥控
  9. php打出等边三角形,CSS_CSS画出各种三角形如等边三角形,下面的代码将演示三角形如何 - phpStudy...
  10. 微信小程序开发:如何快速实现添加一条分割线的项目需求