大数据分析案例-基于决策树算法构建信用卡欺诈识别模型

news2024/9/23 3:18:36

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章

大数据分析案例合集
大数据分析案例-基于随机森林算法预测人类预期寿命
大数据分析案例-基于随机森林算法的商品评价情感分析
大数据分析案例-用RFM模型对客户价值分析(聚类)
大数据分析案例-对电信客户流失分析预警预测
大数据分析案例-基于随机森林模型对北京房价进行预测
大数据分析案例-基于RFM模型对电商客户价值分析
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型
大数据分析案例-基于决策树算法构建员工离职预测模型

大数据分析案例-基于KNN算法对茅台股票进行预测

大数据分析案例-基于多元线性回归算法构建广告投放收益模型
大数据分析案例-基于随机森林算法构建返乡人群预测模型
大数据分析案例-基于决策树算法构建金融反欺诈分类模型

目录

1.项目背景

2.项目简介

2.1项目说明

2.2数据说明

2.3技术工具

3.算法原理

4.项目实施步骤

4.1理解数据

4.2数据预处理

4.3探索性数据分析

4.3.1欺诈数据的比例

4.3.2交易发生地离家的距离

4.3.3距上次交易发生的距离

4.3.4购买价格交易与购买价格中位数的比率

4.3.5其他分析

4.3.6相关性分析

4.4特征工程

4.5模型构建

4.6模型评估

4.7特征重要性评分

4.8模型预测

5.实验总结

源代码


1.项目背景

        随着电子商务和在线支付的迅速发展,信用卡已成为人们日常生活中广泛使用的支付工具之一。然而,与之相伴而生的是信用卡欺诈问题的增加。信用卡欺诈指的是未经持卡人授权,以欺骗手段获取信用卡信息并进行非法交易的行为。这种欺诈行为给信用卡持卡人、商家以及金融机构带来了巨大的经济损失和信誉风险。

        传统的欺诈检测方法主要依靠人工经验和规则,这种方法存在着效率低下、无法应对复杂的欺诈模式以及易受到人为主观因素的影响等问题。因此,研究者们开始探索基于机器学习算法的信用卡欺诈识别模型。

        决策树算法是机器学习中一种常用的分类方法,其通过对数据集进行划分来构建一个树形结构的决策模型。决策树算法具有易于理解和解释的特点,并且可以处理具有非线性关系的数据。因此,基于决策树算法构建信用卡欺诈识别模型是一种有前景的研究方向。

        通过构建决策树模型,可以根据信用卡交易数据中的各种特征,如交易金额、交易时间、地理位置等,自动学习欺诈模式,并对新的信用卡交易进行分类预测。这种基于决策树的欺诈识别模型具有较高的准确性和实时性,可以帮助金融机构快速发现潜在的欺诈交易,并采取相应的措施进行防范和处理,从而减少经济损失并保护客户的权益。

        因此,基于决策树算法构建信用卡欺诈识别模型的研究对于提高信用卡交易的安全性和可靠性具有重要的意义,也是当前机器学习在金融领域中的一个热门研究方向。

2.项目简介

2.1项目说明

        本项目旨在分析信用卡欺诈数据,找出欺诈和非欺诈的特征、影响欺诈的因素,最后使用机器学习算法构建信用卡欺诈识别模型,帮助金融机构快速发现潜在的欺诈交易,并采取相应的措施进行防范和处理,从而减少经济损失并保护客户的权益。

2.2数据说明

        本数据来源于kaggle,原始数据集中共有1000000条数据,共8列变量,具体变量解释如下:

distance_from_home - 交易发生地离家的距离。

distance_from_last_transaction - 距上次交易发生的距离。

ratio_to_median_purchase_price - 购买价格交易与购买价格中位数的比率。

repeat_retailer - 交易是否发生在同一零售商处。

used_chip - 是通过芯片(信用卡)进行的交易。

used_pin_number - 交易是否使用 PIN 码进行。

online_order - 交易是否为在线订单。

fraud- 交易是否具有欺诈性。

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

        决策树( Decision Tree) 又称为判定树,是数据挖掘技术中的一种重要的分类与回归方法,它是一种以树结构(包括二叉树和多叉树)形式来表达的预测分析模型。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。一般,一棵决策树包含一个根节点,若干个内部结点和若干个叶结点。叶结点对应于决策结果,其他每个结点对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果划分到子结点中,根结点包含样本全集,从根结点到每个叶结点的路径对应了一个判定的测试序列。决策树学习的目的是产生一棵泛化能力强,即处理未见示例强的决策树。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

决策树的构建

特征选择:选取有较强分类能力的特征。

决策树生成:典型的算法有 ID3 和 C4.5, 它们生成决策树过程相似, ID3 是采用信息增益作为特征选择度量, 而 C4.5 采用信息增益比率。

决策树剪枝:剪枝原因是决策树生成算法生成的树对训练数据的预测很准确, 但是对于未知数据分类很差, 这就产生了过拟合的现象。涉及算法有CART算法。

决策树的划分选择

熵:物理意义是体系混乱程度的度量。

信息熵:表示事物不确定性的度量标准,可以根据数学中的概率计算,出现的概率就大,出现的机会就多,不确定性就小(信息熵小)。

决策树的剪枝

剪枝:顾名思义就是给决策树 "去掉" 一些判断分支,同时在剩下的树结构下仍然能得到不错的结果。之所以进行剪枝,是为了防止或减少 "过拟合现象" 的发生,是决策树具有更好的泛化能力。

具体做法:去掉过于细分的叶节点,使其回退到父节点,甚至更高的节点,然后将父节点或更高的叶节点改为新的叶节点。

剪枝的两种方法:

预剪枝:在决策树构造时就进行剪枝。在决策树构造过程中,对节点进行评估,如果对其划分并不能再验证集中提高准确性,那么该节点就不要继续王下划分。这时就会把当前节点作为叶节点。

后剪枝:在生成决策树之后再剪枝。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉该节点,带来的验证集中准确性差别不大或有明显提升,则可以对它进行剪枝,用叶子节点来代填该节点。

注意:决策树的生成只考虑局部最优,相对地,决策树的剪枝则考虑全局最优。

4.项目实施步骤

4.1理解数据

首先导入本次实验用到的第三方库,并加载信用卡欺诈数据

 查看数据大小

 查看数据基本信息

查看数据描述性统计

4.2数据预处理

删除缺失值和重复值,从结果来看说明原始数据集中不存在缺失值和重复值

 从前面的描述性统计结果我们发现前三个变量的数值方差很大,波动较大,需要进行异常值处理,先使用箱型图来观察异常值分布

 接着剔除掉异常值

发现数据还有994077条,足够使用了。 

4.3探索性数据分析

4.3.1欺诈数据的比例

 从结果看出原始数据集中欺诈的数据占比很少,但也有80000+,足够建模使用。

4.3.2交易发生地离家的距离

 从结果我们发现,欺诈交易一般都是发生在离家比较远的地方。

4.3.3距上次交易发生的距离

 结果发现该变量似乎没有对欺诈产生影响。

4.3.4购买价格交易与购买价格中位数的比率

 结果发现,欺诈交易的比率一般较高。

4.3.5其他分析

 从结果来看,欺诈交易一般都是发生在同一零售商、不使用PIN码、多为在线订单。

4.3.6相关性分析

4.4特征工程

准备建模用到的数据并且拆分数据集,其中测试集比例为0.2

4.5模型构建

从构建的5个模型来看,其中决策树模型的准确率最高,为99.996%,几乎为100%,故我们最终选择使用决策树算法模型。

4.6模型评估

 可以看出决策树模型的各项指标几乎都接近完美,ROC曲线也是。

接着我们做出决策树图形

4.7特征重要性评分

 结果发现,距上次交易发生的距离、交易发生地离家的距离、购买价格交易与购买价格中位数的比率这三个变量对于欺诈检测的重要性程度最大。

4.8模型预测

随机抽取10个预测结果来检测模型效果,抽取的10全部预测正确

5.实验总结

        本次实验通过分析信用卡欺诈数据,我们找出了欺诈交易的特征以及影响欺诈的因素,最后我们使用决策树算法构建了欺诈识别模型,模型的准确率接近100%,模型效果很棒。

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

源代码

import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(font='SimHei')
warnings.filterwarnings('ignore')

data = pd.read_csv('card_transdata.csv')
data.head()
data.shape
data.info()
data.describe().T
data.dropna(inplace=True)
data.drop_duplicates(inplace=True)
data.shape
# 异常值检测
plt.figure(figsize=(18,8))
for index,col in enumerate(['distance_from_home','distance_from_last_transaction','ratio_to_median_purchase_price'],1):
    plt.subplot(1,3,index)
    sns.boxplot(data=data,x='fraud',y=col)
plt.show()
# 剔除掉异常数据
df = data[(data['distance_from_home']<500)&(data['distance_from_last_transaction']<200)&(data['ratio_to_median_purchase_price']<25)]
df
# 欺诈数据的比例
sns.countplot(data=df,x='fraud')
print(df['fraud'].value_counts())
plt.show()
# 交易发生地离家的距离
sns.boxplot(data=df,x='fraud',y='distance_from_home')
plt.show()
# 距上次交易发生的距离
sns.boxplot(data=df,x='fraud',y='distance_from_last_transaction')
plt.show()
# 购买价格交易与购买价格中位数的比率
sns.boxplot(data=df,x='fraud',y='ratio_to_median_purchase_price')
plt.show()
# 分析交易是否发生在同一零售商处/是通过芯片(信用卡)进行的交易/交易是否使用 PIN 码进行/交易是否为在线订单与欺诈的关系
plt.figure(figsize=(15,8))
plt.subplot(2,2,1)
sns.countplot(data=df,x='fraud',hue='repeat_retailer')
plt.subplot(2,2,2)
sns.countplot(data=df,x='fraud',hue='used_chip')
plt.subplot(2,2,3)
sns.countplot(data=df,x='fraud',hue='used_pin_number')
plt.subplot(2,2,4)
sns.countplot(data=df,x='fraud',hue='online_order')
plt.show()
#相关性
"""
使用heatmap绘制相关性热力图
vmax设定热力图色块的最大区分值
square设定图片是否为正方形
annot 设定是否显示每个色块的系数值
cbar 是否显示图例
cmap 颜色主题
"""
fig = plt.figure(figsize=(18,18))
sns.heatmap(df.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('各个因素之间的相关系数',fontsize=20)
plt.show()
from sklearn.model_selection import train_test_split
# 准备建模的数据
X = df.drop('fraud',axis=1)
y = df['fraud']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
# 构建逻辑回归模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,y_train)
print('逻辑回归模型准确率:',lr.score(X_test,y_test))
# 构建KNN模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print('KNN模型准确率:',knn.score(X_test,y_test))
# 构建朴素贝叶斯模型
from sklearn.naive_bayes import GaussianNB
gb = GaussianNB()
gb.fit(X_train,y_train)
print('朴素贝叶斯模型准确率:',gb.score(X_test,y_test))
# 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train,y_train)
print('决策树模型准确率:',tree.score(X_test,y_test))
# 构建lightgbm模型
from lightgbm import LGBMClassifier
gbm = LGBMClassifier()
gbm.fit(X_train,y_train)
print('lightgbm模型准确率:',gbm.score(X_test,y_test))
from sklearn.metrics import f1_score,r2_score,confusion_matrix,classification_report,auc,roc_curve
# 模型评估
y_pred = tree.predict(X_test)
print('模型的F1值:',f1_score(y_test,y_pred))
print('模型的R方值:',r2_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = tree.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob) 
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
import pydotplus
from six import StringIO
from sklearn.tree import export_graphviz
from IPython.display import Image

# 文件缓存
dot_data = StringIO()
# 将决策树导入到dot中
export_graphviz(tree, out_file=dot_data,  
                filled=True, rounded=True,
                special_characters=True,feature_names = X_train.columns,class_names=['0','1'])
# 将生成的dot文件生成graph
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
# 将结果存入到png文件中
graph.write_png('tree.png')
# 显示
Image(graph.create_png())
# 特征重要性评分
feat_labels = X_train.columns[0:]
importances = gbm.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
    index_list.append(feat_labels[j])
    value_list.append(importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('feature importance',fontsize=14)
plt.show()
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字IC验证的学习路径,新人必备!

优秀的验证工程师&#xff0c;需要掌握的技能有很多&#xff0c;兼备硬件和软件&#xff0c;可以说是更加触类旁通。所以还是需要循序渐进&#xff0c;从最基础的内容开始逐步掌握。 文内所有的学习资料&#xff0c;面试题目&#xff08;文末可全领&#xff09; 1.数电和veri…

VS2015 修复失败

Repair/Modify operation did not finish successfully. “Setup error – repair/modify operation did not finish successfully.” message shown when starting Visual Studio 2015 Problem: When starting Visual Studio 2015, the following message is shown “Setu…

企业实施CIS控制

什么是CIS控件 CIS 关键安全控制由互联网安全中心开发&#xff0c;是一套规范性的、优先的网络安全最佳实践和防御措施&#xff0c;可以帮助防止最普遍和最危险的攻击&#xff0c;并支持多框架时代的合规性。 这些可操作的网络防御最佳实践由一组 IT 专家使用从实际攻击及其有…

Elasticsearch:映射(mapping)的实用实践指南

动态映射适用于开发环境&#xff0c;但对于生产级集群禁用它。 将动态配置为 “strict” 以对索引的字段值实施严格模式。有关动态映射的详细描述&#xff0c;请阅读文章 “Elasticsearch&#xff1a;Dynamic mapping”。 PUT /twitter {"mappings": {"dynamic…

Python——对文件的操作

一、 文件的读写 读文件&#xff1a;从磁盘打开 写文件&#xff1a;将文件存入磁盘 使用内置函数open()创建文件对象。 格式为&#xff1a; file open(filename [,mode,encoding])其中 file ——被创建的文件对象 open ——创建文件对象的函数 filename ——要创建或要打开…

全新特征融合模块AFPN,完胜PAFPN

直接看图说话 论文地址&#xff1a;https://arxiv.org/abs/2306.15988v1 代码地址&#xff1a; GitHub - gyyang23/AFPN 多尺度特征在目标检测任务中对具有尺度方差的目标进行编码时具有重要意义。多尺度特征提取的一种常见策略是采用经典的自上而下和自下而上的特征金字塔网络…

【线程】线程概念及相关函数实现

目录 0. 线程的概念 1. 线程的基本操作 1.1 线程的创建&#xff1a;pthread_create函数 1.2 线程等待&#xff1a;pthread_join函数 1.3 线程的分离&#xff1a;pthread_detach函数 1.4 线程退出&#xff1a;pthread_exit函数 1.5 线程的取消&#xff1a;pthread_cancel…

了解Spring

目录 什么是Spring? DI Spring 存与取 spring 的存操作 spring的取操作 更快速的进行 Spring 存 与 读 三大注入方式 Autowired set 注入 构造方法注入 Spring 容器中有多个相同的类时 Bean 作用域 设置作用域 Spring 执行流程 Bean 生命周期 什么是Spring? Sp…

【密码学基础】半/全同态加密算法基础学习笔记

文章目录 1 半同态加密Pailliar加法同态加密Paillier加解密过程Paillier的同态性Paillier的安全性 El Gamal乘法同态加密RSA乘法同态加密 2 全同态加密BFV全同态加密BFV的编码方式BFV加解密过程BFV的安全性BFV的同态性自举Bootstrapping 3 同态加密应用场景场景1&#xff1a;安…

【maven】安装、使用和常用命令

安装 windows 下载Maven二进制文件 前往Apache Maven官方网站 (https://maven.apache.org) &#xff0c;找到最新的稳定版本&#xff0c;然后下载对应的二进制压缩包&#xff08;如apache-maven-3.8.2-bin.zip&#xff09;。解压缩文件 将下载的压缩包解压到你选择的目录&…

QCC51XX---chain修改

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 如何去修改音频chain链路,就是那种想多加几条输入源或输出,又或者把当前的输入输出换到别的地方的那种应用。例如一个自带mic的dongle,或者模拟输入的LE dongle。 如果要改某个状态下的音频链路,那就需要先找出默认…

修复常见 Android 问题的 9 款顶级 Android 手机维修软件

许多人发现Android手机或平板电脑上的Android操作系统一开始运行得很好&#xff0c;但随着时间的推移&#xff0c;可能会出现各种Android系统问题。您可能会遇到一些问题&#xff0c;例如系统速度变慢、启动无响应、挂起错误、界面冻结、短信停滞、应用程序崩溃等。那么&#x…

Linux学习之内存查看命令free和top

我用来演示的系统使用CentOS Linux release 7.6.1810 (Core)&#xff0c;内核版本是3.10.0-957.el7.x86_64。 Linux在进程申请内存的时候&#xff0c;一般都是尽可能给进程内存&#xff0c;因为进程在申请内存的时候有损耗。 free free命令可以看以k为单位的内存。 free -…

使用less命令搜索文件中的关键字

目录 介绍常用搜索技巧实例 介绍 less 与 more 类似&#xff0c;less 可以随意浏览文件&#xff0c;支持翻页和搜索&#xff0c;支持向上翻页和向下翻页。 语法 less [参数] 文件 参数说明&#xff1a; -b <缓冲区大小> 设置缓冲区的大小 -e 当文件显示结束后&#xff…

STM32 USART

USART.C 文件中只是针对串口1&#xff0c;使用其他串口需要稍作修改 IC、SPI主要用于一块开发板上两个芯片之间的通信&#xff0c;例如&#xff1a;主控和传感器之间的通信 串口适用于两块开发板之间的通信&#xff0c;或者说开发板和上位机之间的通信&#xff0c;有线通信 以…

MAC OS X 这个“安装 macOS Xxx Xxx”应用程序副本已损坏,不能用来安装 macOS,超级终端修改日期date 已解决

原因&#xff1a;旧版 macOS 证书已经过期 解决方法&#xff1a;断开互联网&#xff0c;修改系统时间 date 102013142018.20 说明&#xff1a;10是月&#xff0c;20是日&#xff0c;13是时&#xff0c;14是分&#xff0c;2018是年&#xff0c;20是秒 输入上面的代码按回车后…

【ARM】-异常与中断

文章目录 中断中断请求、中断源中断服务程序保存现场、恢复现场中断仲裁、中断优先级中断嵌套 异常广义上的异常同步异常异步异常精确异步异常&#xff08;Precise Asynchronous Exception&#xff09;非精确异步异常&#xff08;Imprecise Asynchronous Exception&#xff09;…

发展零碳数据中心,超聚变推动液冷规模商用

算力的发展犹如一体两面。 一方面&#xff0c;在数字经济、产业数字化和数字化转型中&#xff0c;算力发挥着关键的引擎作用&#xff1b;另一方面&#xff0c;持续增长的多元异构算力需求、不断提升的算力密度以及逐渐成体系的算力网络&#xff0c;也带来了不可低估的长期能耗…

Linux基础笔记

已经有很长很长一段时间没有更新帖子了&#xff0c;一眨眼2023 已经过半&#xff0c;这些日子里&#xff0c;有太多太多事情要做了&#xff0c;今年只更新了几篇&#xff0c;这几天刚好有空&#xff0c;浅浅更新一篇叭&#xff01;~~~ 首先&#xff0c;Linux是一种开源的操作系…

测试开发工程必备技能之一:Mock的使用

目录 1. 背景 2. Mock是什么 3. Mock能做什么 4. Mock实现方式 5. Mock市面上常见的解决方案 6. Python下unittest.mock使用 总结&#xff1a; 1. 背景 在实际产品开发过程中&#xff0c;某个服务或前端依赖一个服务接口&#xff0c;该接口可能依赖多个底层服务或模块&…