【综合案例】信用卡虚拟交易识别

目录

  • 一、案例背景
  • 二、算法评价指标
    • 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模型
  • 四、模型预测

一、案例背景

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

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

大数据人工智能借助信用卡交易记录的大数据和飞速发展的数据挖掘算法,能够发现可疑的虚假交易,遏制违法行为。其流程如下:
【综合案例】信用卡虚拟交易识别_第1张图片
首先是对原始业务记录数据进行清洗,得到满足算法输入要求的训练集数据,包括算法训练集属性和分类标签;然后选择合适的数据挖掘算法进行模型训练及参数调优;训练好的算法模型可以用来对新数据进行分类预测,判断交易是否为虚假交易。

二、算法评价指标

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

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,即为这个算法优劣的量化指标。
【综合案例】信用卡虚拟交易识别_第2张图片

三、模型建立

3.1 数据来源

本案例数据来自于一个信用卡发卡机构,记录了信用卡刷卡活动数据,数据下载地址:https://www.kaggle.com/mlg-ulb/creditcardfraud
【综合案例】信用卡虚拟交易识别_第3张图片
数据中除了交易时间(Time)、交易金额 (Amount)以及是否为虚假交易分类结果(Class)之外,还有28个关于交易信息的字段数据,由于涉及到商业秘密和客户隐私,分别用V1、V2、V3……表示。

3.2 数据读取

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

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

【综合案例】信用卡虚拟交易识别_第4张图片
可以看出一共有284807个数据,且不存在空值,不需要进行特别的处理;

接着观察数据的基本情况:
【综合案例】信用卡虚拟交易识别_第5张图片
最后,按照分类结果画出饼状图:

# 看看欺诈交易与正常交易的数据量对比
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()

【综合案例】信用卡虚拟交易识别_第6张图片
可以看到正常与虚假交易之间数据量差距较大,在后续模型处理中需要注意!

3.3 因素分析

3.3.1 交易时间

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

#查看正常/欺诈交易与交易时间的关系

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

【综合案例】信用卡虚拟交易识别_第7张图片
可以看出,无论是正常交易或者欺诈交易,除了其数据量有较大差异之外,其他描述性统计量数据大致一致,无较大差异;且两者与总的数据的描述情况也相差不大

f,(ax1,ax2)=plt.subplots(2,1,sharex=True,figsize=(12,6))
bins=100

ax1.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()

从柱状图分布中也无法看出两者分布有明显区别。
【综合案例】信用卡虚拟交易识别_第8张图片

3.3.2 交易金额

同理,分析正常交易/虚假交易量与交易金额之间的关系:
【综合案例】信用卡虚拟交易识别_第9张图片
同样,两者描述性统计量数据相差不大,其分布更是基本一致。
【综合案例】信用卡虚拟交易识别_第10张图片
从以上两个交易信息因素的分析中来看,正常交易和虚假交易在交易时间、交易金额这两个维度上都没有表现出明显的不一致,并不能有效的区分真实交易与虚假交易。因此需要对其他28个属性进行逐个验证。

3.3.3 其他

接下来,我们对剩下的28个属性进行分析,观察正常交易和虚假交易之间的趋势是否一致,若属性与分类结果两个标签的关系曲线趋势差别大,则该属性的取值对是否为正常交易的区分更明显;否则该属性与“交易时间/交易金额”一样,无法明显区分是否为虚假交易。
【综合案例】信用卡虚拟交易识别_第11张图片
对所有属性进行分析可以看到,有的属性分布直方图上,正常交易与虚假交易分布差别大,比如V16、V17;有的属性的分布直方图上,正常交易与虚假交易是重叠的,难以区分,如V25、V26等
【综合案例】信用卡虚拟交易识别_第12张图片
因此,如果是只取部分属性数据作为虚假交易识别的训练集,则应当选用那些属性分布图在正常交易和虚假交易有明显区别的属性。

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值和模型训练时间数据。
【综合案例】信用卡虚拟交易识别_第13张图片
从输出结果来看,在(85279+16)个真实交易样本中,有16个样本被错误分类为虚假交易、在(49+99)个虚假交易样本中,有49个样本被错误分类为正常交易。

最后从绘制出的ROC曲线可以看出,模型在正常交易的区别上准确率较高,在虚假交易的区分上准确率较差。
【综合案例】信用卡虚拟交易识别_第14张图片

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)

【综合案例】信用卡虚拟交易识别_第15张图片
从训练结果来看,无论是TP、TN,还是AUC值都比逻辑回归表现得更好,但在我的运行环境中,随机森林模型训练的时间是最长的。
【综合案例】信用卡虚拟交易识别_第16张图片

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)

【综合案例】信用卡虚拟交易识别_第17张图片
从混淆矩阵来看,148个虚假交易样本中,正确识别的只有8个,错误识别的有140;其AUC值差不多为0.5,也就是和随便猜差不多了在这里插入图片描述
【综合案例】信用卡虚拟交易识别_第18张图片

四、模型预测

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

#使用训练好的随机森林模型进行预测
#从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))

【综合案例】信用卡虚拟交易识别_第19张图片
当尝试的次数足够多的时候,就会发现SVC模型容易出错,而随机森林模型预测的分类结果基本都正确。
【综合案例】信用卡虚拟交易识别_第20张图片
结合模型训练部分来看,预测效果最好的是随机森林模型,训练时间最快的是逻辑回归模型,而支持向量机表现最差,大部分虚假交易都不能识别出来。

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

你可能感兴趣的:(金融数据分析,python,人工智能,python,数据挖掘,数据分析,金融)