首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

构建信用卡反欺诈预测模型——机器学习

作者:Rho

知乎专栏:https://zhuanlan.zhihu.com/BecomingaDataScientist

项目介绍

花半小时看了下文章,说点个人浅见,未必正确仅供批评:1.别幻想什么无监督学习,监督信息来自精准规则,非常强的监督信息。2.不再把围棋当作从数据中学习的问题,回归到启发式搜索这个传统棋类解决思路。这里机器学习实质在解决搜索树启发式评分函数问题。3.如果说深度学习能在模式识别应用中取代人工设计特征,那么这里显示出强化学习能在启发式搜索中取代人工设计评分函数。这个意义重大。启发式搜索这个人工智能传统领域可能因此巨变,或许不亚于模式识别计算机视觉领域因深度学习而产生的巨变。机器学习进一步蚕食其他人工智能技术领域。4.类似想法以往有,但常见于小规模问题。没想到围棋这种状态空间巨大的问题其假设空间竟有强烈的结构,存在统一适用于任意多子局面的评价函数。巨大的状态空间诱使我们自然放弃此等假设,所以这个尝试相当大胆。

5.工程实现能力超级强,别人即便跳出盲点,以启发式搜索界的工程能力也多半做不出来。6.目前并非普适,只适用于状态空间探索几乎零成本且探索过程不影响假设空间的任务。

—— 南大周志华

本项目需解决的问题

本项目通过利用信用卡的历史交易数据,进行机器学习,构建信用卡反欺诈预测模型,提前发现客户信用卡被盗刷的事件。

建模思路

项目背景

数据集包含由欧洲持卡人于2013年9月使用信用卡进行交的数据。此数据集显示两天内发生的交易,其中284,807笔交易中有492笔被盗刷。数据集非常不平衡,积极的类(被盗刷)占所有交易的0.172%。

它只包含作为PCA转换结果的数字输入变量。不幸的是,由于保密问题,我们无法提供有关数据的原始功能和更多背景信息。特征V1,V2,... V28是使用PCA获得的主要组件,没有用PCA转换的唯一特征是“时间”和“量”。特征'时间'包含数据集中每个事务和第一个事务之间经过的秒数。特征“金额”是交易金额,此特征可用于实例依赖的成本认知学习。特征'类'是响应变量,如果发生被盗刷,则取值1,否则为0。

以上取自Kaggle官网对本数据集部分介绍(谷歌翻译),关于数据集更多介绍请参考《Credit Card Fraud Detection》

http://link.zhihu.com/?target=https%3A//www.kaggle.com/dalpozz/creditcardfraud

1 场景解析(算法选择)

1)首先,我们拿到的数据是持卡人两天内的信用卡交易数据,这份数据包含很多维度,要解决的问题是预测持卡人是否会发生信用卡被盗刷。信用卡持卡人是否会发生被盗刷只有两种可能,发生被盗刷或不发生被盗刷。又因为这份数据是打标好的(字段Class是目标列),也就是说它是一个监督学习的场景。于是,我们判定信用卡持卡人是否会发生被盗刷是一个二元分类问题,意味着可以通过二分类相关的算法来找到具体的解决办法,本项目选用的算法是逻辑斯蒂回归(Logistic Regression)。

2)分析数据:数据是结构化数据 ,不需要做特征抽象。特征V1至V28是经过PCA处理,而特征Time和Amount的数据规格与其他特征差别较大,需要对其做特征缩放,将特征缩放至同一个规格。在数据质量方面 ,没有出现乱码或空字符的数据,可以确定字段Class为目标列,其他列为特征列。

3)这份数据是全部打标好的数据,可以通过交叉验证的方法对训练集生成的模型进行评估。70%的数据进行训练,30%的数据进行预测和评估。

现对该业务场景进行总结如下

根据历史记录数据学习并对信用卡持卡人是否会发生被盗刷进行预测,二分类监督学习场景,选择逻辑斯蒂回归(Logistic Regression)算法

数据为结构化数据,不需要做特征抽象,但需要做特征缩放

2 数据预处理(Pre-processing Data)

前期准备

# Imports# Numpy,Pandasimport numpy as npimport pandas as pdimport datetime# matplotlib,seaborn,pyechartsimport matplotlib.pyplot as pltimport matplotlib.gridspec as gridspec# plt.style.use('ggplot') #风格设置近似R这种的ggplot库import seaborn as snssns.set_style('whitegrid')%matplotlib inlineimport missingno as msno# import sklearnfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import precision_recall_curvefrom sklearn.metrics import aucfrom sklearn.metrics import roc_auc_scorefrom sklearn.metrics import roc_curvefrom sklearn.metrics import recall_scorefrom sklearn.metrics import classification_reportfrom sklearn.metrics import accuracy_scorefrom sklearn.preprocessing import StandardScaler# 忽略弹出的warningsimport warningswarnings.filterwarnings('ignore') pd.set_option('display.float_format', lambda x: '%.4f' % x)from imblearn.over_sampling import SMOTEimport itertools

数据获取与解析

data_cr = pd.read_csv('creditcard.csv' , encoding='latin-1') #读取数据data_cr.head() #查看表格默认前5行

从上面可以看出,数据为结构化数据,不需要抽特征转化,但特征Time和Amount的数据规格和其他特征不一样,需要对其做特征做特征缩放。

data_cr.shape #查看数据集的大小

本数据集大小为28万行,31列。

data_cr.info() # 查看数据的基本信息

通过查看数据信息得知,数据的类型基本是float64和int64数据类型。

data_cr.describe().T #查看数据基本统计信息

msno.matrix(data_cr) # 查看缺失值情况

通过上图可以获知,数据集不存在缺失值,因此不需作缺失值处理。

3 特征工程(Feature Engineering)

# 目标变量分布可视化fig, axs = plt.subplots(1,2,figsize=(14,7))sns.countplot(x='Class',data=data_cr,ax=axs[0])axs[0].set_title("Frequency of each Class")data_cr['Class'].value_counts().plot(x=None,y=None, kind='pie', ax=axs[1],autopct='%1.2f%%')axs[1].set_title("Percentage of each Class")plt.show()

# 查看目标列的情况

data_cr.groupby('Class').size()

数据集284,807笔交易中有492笔是信用卡被盗刷交易,信用卡被盗刷交易占总体比例为0.17%,信用卡交易正常和被盗刷两者数量不平衡,样本不平衡影响分类器的学习,稍后我们将会使用过采样的方法解决样本不平衡的问题

特征衍生

特征Time的单为秒,我们将其转化为以小时为单位对应每天的时间。

data_cr['Hour'] =data_cr["Time"].apply(lambda x : divmod(x, 3600)[0]) #单位转换

特征选择(数据探索)

查看信用卡正常用户与被盗刷用户之间的区别。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181105B1ETS500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券