机器学习——信用卡反欺诈案例
导入类库
1 import numpy as np 2 import pandas as pd 3 from pandas import Series, DataFrame 4 import matplotlib.pyplot as plt 5 from sklearn.preprocessing import StandardScaler 6 from imblearn.over_sampling import SMOTE 7 from sklearn.ensemble import GradientBoostingClassifier 8 from sklearn.model_selection import train_test_split 9 from sklearn.linear_model import LogisticRegression 10 from sklearn.metrics import confusion_matrix 11 import itertools 12 from sklearn.model_selection import GridSearchCV 13 from sklearn.metrics import auc, roc_curve
作图函数
1 def plot_confusion_matrix(cm, classes, 2 title='Confusion matrix', 3 cmap=plt.cm.Blues): 4 """ 5 This function prints and plots the confusion matrix. 6 """ 7 plt.imshow(cm, interpolation='nearest', cmap=cmap) 8 plt.title(title) 9 plt.colorbar() 10 tick_marks = np.arange(len(classes)) 11 plt.xticks(tick_marks, classes, rotation=0) 12 plt.yticks(tick_marks, classes) 13 14 threshold = cm.max() / 2. 15 for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): 16 plt.text(j, i, cm[i, j], 17 horizontalalignment="center", 18 color="white" if cm[i, j] > threshold else "black") # 若对应格子上面的数量不超过阈值则,上面的字体为白色,为了方便查看 19 20 plt.tight_layout() 21 plt.ylabel('True label') 22 plt.xlabel('Predicted label') 23 plt.show()
数据获取与解析
数据为结构化数据,不需要抽特征转化, 但特征Time和Amount的数据规格和其他特征不一样, 需要对其做特征做特征缩放
1 credit = pd.read_csv('./creditcard.csv') 2 3 print('原始行列 >>>>', credit.shape) # (284807行, 31列) 4 # print(credit.head()) # 前5行 5 # print(credit.dtypes) # 查看特征(列)类型。结果:数据类型只有float64和int64 6 # print(credit.isnull().any()) # 判断是否有缺失值。结果:无缺失值,方便后续处理 7 # print(credit.info()) # 查看数据集详细信息(类型,占用大小,缺失值,行列等)
特征工程
1 # c_counts = credit['Class'].value_counts() 2 # print(c_counts, type(c_counts)) # 对Class列分类统计,并判断类型 3 # print(c_counts.index, c_counts.values) # 提取索引和值 4 ''' 5 结果: 6 0 284315 7 1 492 8 Name: Class, dtype: int64 9 Name: Class, dtype: int64 <class 'pandas.core.series.Series'> 10 Int64Index([0, 1], dtype='int64') [284315 492] 11 ''' 12 13 # 对c_counts作图进行分析 14 # plt.figure(figsize=(10, 6)) 15 # 饼图:两种作图方式 16 # ax = plt.subplot(121) 17 # c_counts是pandas的Series类型,pandas可以使用plot快速作图 18 # c_counts.plot(kind='pie', autopct='%0.3f%%', ax=ax) 19 # plt.pie(c_counts, autopct='%0.3f%%') 20 21 # 柱状图:两种作图方式 22 # ax = plt.subplot(122) 23 # c_counts.plot(kind='bar', ax=ax) 24 # plt.bar(c_counts.index, c_counts.values) 25 # plt.show() 26 ''' 27 存在492例盗刷,占总样本的0.17%, 28 存在明显的数据类别不平衡问题, 29 可采用过采样(增加数据)的方法处理该问题 30 '''
特征转换
将时间从单位每秒化为单位每小时 divmod(7201,3600) 结果:(2, 1) 元组,2为商,1为余数
1 credit['Time'] = credit['Time'].map(lambda x: divmod(x, 3600)[0]) 2 # print(credit['Time']) # map高级函数:将Time中的每个元素作用于lambda函数
特征选择
1 # Class列中值为0的为True,值为1为False,生成的cond0行数不变 2 # cond0 = credit['Class'] == 0 3 # Class列中值为0的为False,值为1为True,生成的cond0行数不变 4 # cond1 = credit['Class'] == 1 5 # print('cond0 >>>>', len(cond0)) 6 # print('cond1 >>>>', len(cond1)) 7 8 # 作图分析 9 # credit['V1'][cond0].plot(kind='hist', bins=500) 10 # credit['V1'][cond1].plot(kind='hist', bins=50) 11 # plt.show() 12 13 # 调试查看用 14 # print("credit['V1'] >>>>", credit['V1']) 15 # print('cond0 >>>>', cond0) 16 # print('cond1 >>>>', cond1) 17 18 # 筛选出存在于V1列中且在cond0中为True的值(284315) 19 # print("credit['V1'][cond0] >>>>", credit['V1'][cond0]) 20 # 筛选出存在于V1列中且在cond0中为True的值(492) 21 # print("credit['V1'][cond1] >>>>", credit['V1'][cond1]) 22 23 ''' 作图分析:将每一个特征根据Class的真假进行划分, 图像中两种图形的重合度越大说明该特征对Class的影响越小, 所以需要剔除掉无用的特征 ''' 24 # cols = ['V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 25 # 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 26 # 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28'] 27 # 作图:28行,1列,每一行显示一个特征对应的图 28 # plt.figure(figsize=(12, 2800)) 29 # for i, col in enumerate(cols): 30 # ax = plt.subplot(28, 1, i + 1) 31 # density(normed)标准化数据:将过大或过小的数据统一标准化 32 # credit[col][cond0].plot(kind='hist', bins=500, density=True, ax=ax) 33 # credit[col][cond1].plot(kind='hist', bins=50, density=True, ax=ax) 34 # 35 # ax.set_title(col) 36 # plt.show() 37 38 # 待剔除的列(10列) 39 drops = ['V13', 'V15', 'V20', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28'] 40 # 删除指定列(axis=1按列,axis=0按行) 41 credit2 = credit.drop(labels=drops, axis=1) 42 print('人眼剔除无用列后 >>>>', credit2.shape) 43 ''' 不同变量在信用卡被盗刷和信用卡正常的不同分布情况, 选择在不同信用卡状态下的分布有明显区别的变量。 因此剔除变量V13 、V15 、V20 、V22、 V23 、V24 、V25 、V26 、V27 和V28变量 '''
特征缩放
Amount变量和Time变量的取值范围与其他变量相差较大, 所以要对其进行特征缩放
1 # print('原Amount数据最大值', credit2['Amount'].max()) 2 # print('原Amount数据最小值', credit2['Amount'].min()) 3 # print('原Time数据最大值', credit2['Time'].max()) 4 # print('原Time数据最小值', credit2['Time'].min()) 5 6 # 创建标准化对象 7 standScaler = StandardScaler() 8 cols = ['Time', 'Amount'] 9 # 标准化数据 10 credit2[cols] = standScaler.fit_transform(credit2[cols]) 11 # print('标准化Amount后最大值 >>>>', credit2['Amount'].max()) 12 # print('标准化Amount后最小值 >>>>', credit2['Amount'].min()) 13 # print('标准化Time后最大值 >>>>', credit2['Time'].max()) 14 # print('标准化Time后最小值 >>>>', credit2['Time'].min())
特征重要性排序
对特征的重要性进行排序,以进一步减少变量 利用GBDT梯度提升决策树进行特征重要性排序
1 # 创建GBDT对象 2 # clf = GradientBoostingClassifier() 3 # 特征训练集:前20列 4 # X_train = credit2.iloc[:, :-1] 5 # print('X_train.shape >>>>', X_train.shape) 6 # cols = X_train.columns 7 # print('X_train.columns >>>>', X_train.columns) 8 # 目标值训练集:Class列 9 # y_train = credit2['Class'] # y_train = credit2.iloc[:,-1] 10 # print('y_train.shape >>>>', y_train.shape) 11 # 训练数据 12 # clf.fit(X_train, y_train) 13 # 得到特征重要性数据 14 # feature_importances_ = clf.feature_importances_ 15 # print('feature_importances_ >>>>', feature_importances_) 16 # 从大到小对特征重要性进行排序,并作图分析 17 # argsort():对数组排序并返回排序后每个元素对应的未排序时自身所在的索引 18 # index = feature_importances_.argsort()[::-1] 19 # print('从大到小排列特征重要性,返回每个元素的原索引 >>>>', index, len(index)) 20 21 # plt.figure(figsize=(12, 9)) 22 # 柱状图,第二个参数代表按从大到小排列的特征数据 23 # plt.bar(np.arange(len(index)), feature_importances_[index]) 24 # 柱状图x坐标:第二个参数是按特征值从大到小排列后的特征名 25 # plt.xticks(np.arange(len(index)), cols[index]) 26 # plt.show() 27 # 根据图像得到要删除的特征列(最小的后9列) 28 drops = ['V7', 'V21', 'V8', 'V5', 'V4', 'V11', 'V19', 'V1', 'Amount'] 29 credit3 = credit2.drop(labels=drops, axis=1) 30 print('通过GBDT分析剔除无用列后 >>>>', credit3.shape) 31 # print('credit3.columns >>>>', credit3.columns)
模型训练
处理样本不平衡问题
目标变量“Class”正常和被盗刷两种类别的数量差别较大,会对模型学习造成困扰。
举例来说,假如有100个样本,其中只有1个是被盗刷样本,
其余99个全为正常样本,那么学习器只要制定一个简单的方法:
即判别所有样本均为正常样本,就能轻松达到99%的准确率。
而这个分类器的决策对我们的风险控制毫无意义。
因此,在将数据代入模型训练之前,我们必须先解决样本不平衡的问题。
现对该业务场景进行总结如下:
过采样(oversampling):
增加正样本使得正、负样本数目接近,然后再进行学习。
欠采样(undersampling):
去除一些负样本使得正、负样本数目接近,然后再进行学习。
本次处理样本不平衡采用的方法是过采样,
具体操作使用SMOTE(Synthetic Minority Oversampling Technique),
SMOET的基本原理是:
采样最邻近算法,计算出每个少数类样本的K个近邻,
从K个近邻中随机挑选N个样本进行随机线性插值,
构造新的少数样本,同时将新样本与原数据合成,产生新的训练集。
1 # SMOTE 过采样 2 X = credit3.iloc[:, :-1] 3 y = credit3.Class 4 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) 5 X_train,y_train 作为训练数据 训练时,保证样本均衡,将X_train和y_train样本过采样处理 测试时候,可以样本不均衡 6 # print('未均衡的y训练集分类统计(Class) >>>>', y_train.value_counts()) 7 8 smote = SMOTE() 9 # ndarray 10 X_train_new, y_train_new = smote.fit_sample(X_train, y_train) 11 # print('均衡后的x训练集 >>>>', X_train_new, type(X_train_new)) 12 # print('均衡后的y训练集(Class) >>>>', y_train_new, type(y_train_new), len(y_train_new)) 13 # y_train_new类型为numpy.ndarray,需转化为pandas.Series类型才可分类统计 14 # print('均衡后的y训练集分类统计(Class) >>>>', Series(y_train_new).value_counts())
求召回率
单独的逻辑回归求得查全率Recall rate,Recall也叫召回率
1 # 创建逻辑回归对象 2 # logistic = LogisticRegression() 3 # print(logistic) 4 ''' 5 LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 6 intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, 7 penalty='l2', random_state=None, solver='liblinear', tol=0.0001, 8 verbose=0, warm_start=False) 9 ''' 10 # 训练均衡后的数据 11 # logistic.fit(X_train_new, y_train_new) 12 # 预测 13 # y_ = logistic.predict(X_test) 14 # print('y_test >>>>', y_test) 15 # print('预测的y_ >>>>', y_) 16 # 交叉表 17 # print('交叉表 >>>>', pd.crosstab(y_test, y_, margins=True)) 18 19 # 混合矩阵 20 # cm = confusion_matrix(y_test, y_) 21 # print('混合矩阵 >>>>', cm, type(cm)) 22 # Recall------“正确被检索的正样本item(TP)"占所有"应该检索到的item(TP+FN)"的比例 23 # plot_confusion_matrix(cm, [0, 1], title='Recall:%0.3f' % (cm[1, 1] / (cm[1, 0] + cm[1, 1])))
交叉验证与调优
1 logistic = LogisticRegression() 2 clf = GridSearchCV(logistic, param_grid={'tol': [1e-3, 1e-4, 1e-5], 'C': [1, 0.1, 10, 100]}, cv=10, iid=False, n_jobs=1) 3 print(clf.fit(X_train_new, y_train_new)) 4 # print('best_score_ >>>>', clf.best_score_) 5 # print('best_params_ >>>>', clf.best_params_) 6 # print('best_index_ >>>>', clf.best_index_) 7 # print('best_estimator_ >>>>', clf.best_estimator_) 8 9 # 预测 10 # y3_ = clf.best_estimator_.predict(X_test) 11 # print('y3_预测(best_estimator_) >>>>', confusion_matrix(y_test, y3_)) 12 13 # y2_ = clf.predict(X_test) 14 # print('y2_预测 >>>>', confusion_matrix(y_test, y2_)) 15 16 # cm2 = confusion_matrix(y_test, y2_) 17 18 # 可视化,对比逻辑斯蒂回归和GridSearchCV结果 19 # plot_confusion_matrix(cm, [0, 1], title='Logistic Recall:%0.3f' % (cm[1, 1] / (cm[1, 0] + cm[1, 1]))) 20 # plot_confusion_matrix(cm2, [0, 1], title='GridSearchCV Recall:%0.3f' % (cm2[1, 1] / (cm2[1, 0] + cm2[1, 1])))
模型评估
解决不同的问题,通常需要不同的指标来度量模型的性能。
例如我们希望用算法来预测癌症是否是恶性的,
假设100个病人中有5个病人的癌症是恶性,
对于医生来说,尽可能提高模型的查全率(recall)比提高查准率(precision)更为重要,
因为站在病人的角度,发生漏发现癌症为恶性比发生误 判为癌症是恶性更为严重
由此可见就上面的两个算法而言,明显lgb过拟合了,
考虑到样本不均衡问题,
故应该选用简单一点的算法(逻辑回归)来减少陷入过拟合的陷阱
1 y_proba = clf.predict_proba(X_test) 2 # 预测被盗刷的概率 3 print(y_proba)
转载于:https://www.cnblogs.com/siplips/p/9810354.html
机器学习——信用卡反欺诈案例相关推荐
- 构建信用卡反欺诈预测模型——机器学习
本项目需解决的问题 本项目通过利用信用卡的历史交易数据,进行机器学习,构建信用卡反欺诈预测模型,提前发现客户信用卡被盗刷的事件. 建模思路 项目背景 数据集包含由欧洲持卡人于2013年9月使用信用卡进 ...
- 项目实例---金融---用机器学习构建模型,进行信用卡反欺诈预测
来源: 用机器学习构建模型,进行信用卡反欺诈预测 反欺诈中所用到的机器学习模型有哪些? Credit card fraud detection 构建信用卡反欺诈预测模型--机器学习 信用卡交易数据相关 ...
- 兴业银行与第四范式开启AI平台加速模式 毫秒级信用卡反欺诈系统上线
近日,基于第四范式为兴业银行打造的低门槛.自动化的人工智能平台,兴业银行信用卡中心推出了毫秒级智能交易反欺诈系统,实现了对信用卡欺诈风险自动化.智能化.精确化的甄别与管控,为信用卡用户提供最安全.可信 ...
- 反欺诈概念库-信用卡反欺诈管理
原文:http://www.cnki.com.cn/Article/CJFDTotal-XYKZ200508004.htm 2005年6月,美国爆出4000万张信用卡资料外泄的特大新闻.消息传来,舆论 ...
- Python分析信用卡反欺诈
本文研究的是大数据量(284807条数据)下模型选择的问题,也参考了一些文献,但大多不够清晰,因此吐血整理本文,希望对大家有帮助; 本文试着从数据分析师的角度,设想"拿到数据该如何寻找规律. ...
- python算法实现反欺诈案例完整建模流程!电信诈骗这么多?
近年来,国内的电信诈骗案件呈愈演愈烈之势,本文以某省电信公司简化版本的防诈骗模型为案例,利用python机器学习工具,使用随机森林算法,从数据处理.特征工程.到反诈骗模型的模型的构建及评估等完整流程进 ...
- 【采用】互联网金融反欺诈体系构建及典型应用案例
一.互联网反欺诈体系的构建存在着以下三个原则: (准)实时性:考虑到用户体验,互联网反欺诈体系必须能够在非常短的时间内对欺诈行为进行认定,并给出判断.对于注册.登陆.支付等一些场景,必须能够在用户无感 ...
- 信贷反欺诈的常用手段:名单库、专家策略、机器学习
低廉的造假成本和层出不穷的欺诈手段,给一个信贷机构带来的不仅仅是风险损失,更给信贷机构带来极大的挑战.在整个信贷流程中,如何在贷前申请中准备快速地识别欺诈风险,将欺诈群体拒之门外是业务的重中之重. 信 ...
- 【总结】反欺诈(Fraud Detection)中所用到的机器学习模型
反欺诈(Fraud Detection)是指识别和预防欺诈行为的过程,通常是通过监视和分析数据来识别异常行为和模式.机器学习在反欺诈中发挥了重要作用,可以使用各种机器学习算法来建立预测模型.下面列举了 ...
- 【风控术语】数字金融反欺诈技术名词表
转自:https://blog.csdn.net/hajk2017/article/details/80866115 感谢博主分享 另附Tech Fin微信社群,感兴趣可添加微信wu805686220 ...
最新文章
- vue项目多入口教程
- Android studio 另一个程序正在使用此文件,进程无法访问
- ButterKnife--View注入框架
- 对象的比较与排序(三):实现IComparableT和IComparerT泛型接口
- c++内存中字节对齐问题详解
- linux 进程间读写锁,Linux系统编程—进程间同步
- linux下c 指针变量大小,C语言sizeof关键字
- vsCode切换分支git
- python 流式编程_Java8 Stream流式编程,极大解放你的生产力!
- python获取日期的年月日_python datetime和time的一些疑惑解答 及 获取上年同期、上月等日期...
- vs2015完全卸载+重装 成功解决 未能加载xx包、未能安装编译器等问题
- 公路护栏设计技术简析
- FPS游戏方框透视基本原理
- .net core 创建桌面应用程序(极简流程)
- linux 安全删除文件_如何在Linux上安全删除文件
- 感悟哪吒的故事,我命由我不由天
- 技术总监7年总结,如何进行正确的沟通?
- C++ 常数据成员、常成员函数和常对象
- 渗透测试工具实战技巧合集
- 快速查询PE文件知识点和PE文件解析(下)
热门文章
- vue element-ui el-form表单验证表单验证,数值输入验证踩坑
- hbase snappy 安装_Hadoop HBase 配置 安装 Snappy 终极教程
- 设计模式之观察者模式详解(附应用举例实现)
- 飞行CSS3导航菜单
- flutter (笔记) 动画学习
- 国企安逸?我笑了……
- 东原服务器开机显示bb,启用tls后,服务器出现remote error: tls: bad certificate
- 知识点 - 后缀数组
- 立创eda学习笔记十七:铺铜
- Asp.NET Excel导入数据返回JSON字符