自动编码器检测检测信用卡欺诈

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动编码器检测检测信用卡欺诈相关的知识,希望对你有一定的参考价值。

首先我们来学习自动编码器。
自动编码器是一种无监督机器学习算法、有三层的神经网络:输入层、隐藏层(编码层)和解码层。该网络的目的是重构其输入,使其隐藏层学习到该输入的良好表征。其应用了反向传播,可将目标值设置成与输入值相等。自动编码器属于无监督预训练网络(Unsupervised Pretained Networks)的一种。其结构如下图所示:
在这里插入图片描述

自动编码器的目标是学习函数 h(x)≈x。换句话说,它要学习一个近似的恒等函数,使得输出 x^ 近似等于输入 x。自动编码器属于神经网络家族,但它们也和 PCA(主成分分析)紧密相关,其一些关键特点为:
它是一种类似于 PCA 的无监督机器学习算法
它要最小化和 PCA 一样的目标函数
它是一种神经网络
这种神经网络的目标输出就是其输入
尽管自动编码器与 PCA 很相似,但自动编码器比 PCA 灵活得多。在编码过程中,自动编码器既能表征线性变换,也能表征非线性变换;而 PCA 只能执行线性变换。因为自动编码器的网络表征形式,所以可将其作为层用于构建深度学习网络。

本次实验用到的数据集来自kaggle竞赛提供(最初是来自位于比利时布鲁塞尔ULB(Université Libre de Bruxelles) 的研究小组Worldline and the Machine Learning Group,基于证书Database: Open Database, Contents: Database Contents发布),可以从这里下载:https://www.kaggle.com/mlg-ulb/creditcardfraud
在这里插入图片描述

该页面同时简单地展示了数据集的内容
在这里插入图片描述

数据集的整体特征如下
在这里插入图片描述

在284807条交易记录中共包含492条欺诈记录。显然,数据集是不平衡的,欺诈这个类别仅仅占了0.172%。
数据集仅包含数值型的变量是因为做了PCA变换。特征V1,V2,…V28分别是通过PCA变换得到的主成成分。
没有做PCA变换的变量是 Time 和 Amount
文件 creditcardfraud.csv中包含31个字段,具体信息如下:
每一行记录了一条交易。
在这里插入图片描述

导入所需库文件
在这里插入图片描述

从Kaggle下载信用卡欺诈数据集并将其解压后放置在与python脚本相同的目录中。 数据包含在两天内进行的284,807笔欧洲信用卡交易和492笔欺诈交易。
数据集中的所有变量都是数值型的。由于隐私原因,已经用主成分变换对数据进行了转换,其中时间和数量这两个特征并没有改变。这里的时间包括数据集中每笔交易和第一笔交易之间过去了多少秒。
加载数据并打印前几行看看是否加载成功
在这里插入图片描述

脚本在1.py
测试如下
在这里插入图片描述

然后检测数据集的规模以及在其中是否存在缺失值
在这里插入图片描述

还要检查正常和欺诈性数据行的预期数量。 我们只需使用“class”列,然后计算正常(0)和欺诈(1)行的数量
在这里插入图片描述

完整代码在2.py
测试如下
在这里插入图片描述

从上图可见:
第一行的输出表示数据为294,807行和31列
false表示没有缺失值
之后两行表示与预期的一样(284,315笔正常交易和492笔欺诈交易)。 通常,这在欺诈和异常检测中很常见,这是一个非常不平衡的数据集
我们可以进一步通过数据进行绘图
在这里插入图片描述

完整代码在3.py
测试得到下图
在这里插入图片描述

可以看到我们的数据集高度不平衡。正常的交易数量远远大于欺诈的交易数量。
接下来将这两种类型的交易切分开
在这里插入图片描述

根据汇总统计数据,看看欺诈与正常交易之间是否存在明显的差异。
在这里插入图片描述

完整代码在4.py
测试如下
在这里插入图片描述

从结果可以看到尽管欺诈交易中的均值略高(122>88),但是它肯定在标准偏差之内,因此,不可能很容易用纯统计方法以高度精确的方式在类别之间进行区分。
接下来我们分别尝试对正常数据和异常数据进行可视化,我们省略高于2500以及低于200的交易,并以100为步长间隔查看数据
代码如下
在这里插入图片描述

完整代码在5.py
测试得到下图
在这里插入图片描述

从上图中我们可以看到,在长尾巴中,我们更容易观察到欺诈交易,但是仅凭交易金额就很难将欺诈与正常交易区分开
那我们试试以时间作为变量来考虑是否有用,比如是不是欺诈的数据更容易集中在某几个时间点发生?
在这里插入图片描述

完整代码在6.py
测试得到下图
在这里插入图片描述

由上图可以看到交易的时间特征并不重要,正常的交易和欺诈的交易在任何时间分布的比例都差不多

既然这两种方法似乎都行不通,我们可以考虑使用自动编码器。
时间、交易金额的区间是不同的,所以首先需要将数据缩放到相似的大小。 我们前面已经知道大多数数据(“time”和“amount”除外)是来自PCA分析的结果。 对数据集进行的PCA将其转换为标准范式。 我将对“time”和“amount”列执行相同的操作。
在这里插入图片描述

划分训练集、测试集
在这里插入图片描述

接下来创建模型
我们来设置自动编码器的结构。 它具有全连接的对称编码和解码层。 这些层的大小的选择是相对任意的,并且通常编码器会尝试一些不同的层大小。
我们正在将输入缩减为某种形式的简化编码,然后再次对其进行扩展。 输入和输出维度是特征空间(30列),因此编码层应减小到代表希望的某些特征的数量。 在目前这种情况下,可以将30列编码为14维,因此高层特征大约由两列表示(30/14 = 2.1)。 在这些高层特征中,我们希望它们可以映射到数据中的七个隐层的特征
在这里插入图片描述

接下来就是训练模型
在这里插入图片描述

完整代码在7.py
我们跑1个epoch,结果如下
在这里插入图片描述

接下来评估我们的模型,在我们前面跑1个epoch的时候可以看到损失还是在下降的,说明还有进一步提升性能的空间
接下来我们设置epoch=5,然后绘图看看模型损失
在这里插入图片描述

还可以绘图查看ROC曲线
在这里插入图片描述

完整代码在8.py
测试得到下图
第一个图
在这里插入图片描述

从上图可以看到随着epoch增加,损失在逐渐减小
第二个图
在这里插入图片描述

我们来介绍一个指标–AUC(Area Under Curve),其被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值
那么从上图可以看出本次实验的AUC还是比较接近1.0的,说明性能还可以

我们还可以打印出召回率和精确度
在这里插入图片描述

完整代码在9.py
测试结果如下
在这里插入图片描述

我们知道
精确率即Precision就是模型所得分类结果中,真正的正例与分类所得正例的比值,也可叫作查准率;召回率即Recall就是模型所得分类结果中,真正的正例与数据中实际真正正例的比值,也可叫做查全率
recall和precision之间的权衡一直存在。高recall但低precision意味着大部分结果的相关性很低,甚至无相关性。高precision,但recall却很低时,我们就会有相反的结果——返回的结果少,但相关性非常高。理想情况下,我们需要高准确率和高召回率——结果很多且高度相关
那么我们打印出在不同阈值下的recall和precision看看
在这里插入图片描述

完整代码在10.py
测试如下
在这里插入图片描述

显而易见,recall和precision不可能同时取到最高的值
我们这里就指定阈值为5,随机保留20%的数据,打印出混淆矩阵
在这里插入图片描述

完整代码在11.py
测试得到下图
在这里插入图片描述

从混淆矩阵看到TP=56204,TN=643,FP=37,FN=78
我们可以用公式计算出f1=2tp/(2tp+fp+fn)=99.89%,可见模型的性能还是非常好的

参考:
1.https://www.kaggle.com/mlg-ulb/creditcardfraud
2.https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Projects/tree/master/Chapter07
3.https://blog.csdn.net/program_developer/article/details/79946787
4.https://blogs.oracle.com/datascience/fraud-detection-using-autoencoders-in-keras-with-a-tensorflow-backend
5.https://www.kesci.com/home/dataset/5b56a592fc7e9000103c0442
6.https://www.jiqizhixin.com/graph/technologies/07645339-ced5-4871-bb96-98062cf4a547

以上是关于自动编码器检测检测信用卡欺诈的主要内容,如果未能解决你的问题,请参考以下文章

005-信用卡欺诈检测

R语言:利用机器学习建立信用卡反欺诈模型

机器学习实战分享:用 Python 进行信用卡欺诈检测

基于逻辑回归信用卡欺诈检测

学习笔记Flink—— 基于Flink 在线交易反欺诈检测

学习笔记Flink—— 基于Flink 在线交易反欺诈检测