用svm预测信用卡诈骗
数据集来源于Kaggle https://www.kaggle.com/mlg-ulb/creditcardfraud, 用于预测信用卡用户是否会落入诈骗组,这里发一个中文版本的存稿
数据初探
首先导入数据
dat = pd.read_csv("E:/study/machine learning/credit card fraud/creditcard.csv")
df = pd.DataFrame(dat)
df.describe()Time V1 V2 ... Amount Class Amount_log
0 0.0 -1.359807 -0.072781 ... 149.62 0 5.008166
1 0.0 1.191857 0.266151 ... 2.69 0 0.993252
2 1.0 -1.358354 -1.340163 ... 378.66 0 5.936665
3 1.0 -0.966272 -0.185226 ... 123.50 0 4.816322
4 2.0 -1.158233 0.877737 ... 69.99 0 4.248495
5 2.0 -0.425966 0.960523 ... 3.67 0 1.302913
6 4.0 1.229658 0.141004 ... 4.99 0 1.609438
7 7.0 -0.644269 1.417964 ... 40.80 0 3.708927
8 7.0 -0.894286 0.286157 ... 93.20 0 4.534855
9 9.0 -0.338262 1.119593 ... 3.68 0 1.305626
10 10.0 1.449044 -1.176339 ... 7.80 0 2.055405
11 10.0 0.384978 0.616109 ... 9.99 0 2.302585
12 10.0 1.249999 -1.221637 ... 121.50 0 4.79...
数据共31列,除去是否落入诈骗组的“Class”组外,另有时间和消费额,以及用于隐藏用户信息、经过PCA处理过的V1至V28,我们首先来看数据在Class组中的分布
plt.figure(figsize=(7,5))
sns.countplot(df['Class'])
plt.title("Fraud and not Fraud Class Count", fontsize=18)
plt.xlabel("Fraud and not Fraud", fontsize=15)
plt.ylabel("Count", fontsize=15)
plt.show()
我们可以看到,这是一组明显的不平衡数据集,参与过诈骗的用户量远远少没参与过诈骗的用户,这意味着我们在建模前,首先要对数据集的不平衡性进行处理,否则模型会始终倾向于将用户分入非诈骗组。
我们继续分析另外两个明确定义的变量,下图是经过log处理后的消费额Amount与Class的箱型图,从图中我们可以看到,信用卡诈骗用户的消费额范围更广,且IQR明显高于非诈骗用户,但最高的消费额存在于非诈骗组。
df['Amount_log'] = np.log(df['Amount'] + 0.01) # engineer the data for better visualization
plt.figure(figsize=(7,5))
sns.boxplot(x = "Class", y = "Amount_log", data = df)
plt.show()
最后我们分析时间与class的关系,
fraud = df[df["Class"] == 1]
nonfraud = df[df["Class"] == 0]plt.figure(figsize=(7,20))
plt.subplot(211)
ax1 = sns.scatterplot(x=fraud["Time"],y=fraud["Amount"])
plt.subplot(212)
ax2 = sns.scatterplot(x=nonfraud["Time"],y=nonfraud["Amount"])
plt.show()
在不同的时间维度上,诈骗组和非诈骗组的消费额虽都整体偏低,但分布都非常均匀,该图显示时间与是否诈骗没有什么明显的关系。在之后建模时,我们可以考虑删除时间变量。
我们现在再来看看变量之间的相关性
df_corr = df.corr()
plt.figure(figsize=(7,5))
sns.heatmap(df_corr, cmap="YlGnBu")
plt.title('Heatmap correlation')
plt.show()
从上图我们可以看出,绝大多数的变量之间都没有相关关系,这也侧面证明了变量也确实经过了PCA,不需要再次进行PCA的处理。
建模
首先,我们需要将数据集分为训练集和测试集两部分
X = df.drop(["Amount_log", "Time", "Class"],axis=1)
y = df["Class"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 12)
处理不平衡数据有多种方法,考虑到训练时间问题(因为我们这里选择的是需要较长训练时间的SVM),这里我们选择undersampling,从多数集中抽样,使诈骗组和非诈骗组中的用户量成为同一个量级
undersampling_train = pd.concat([X_train,y_train],axis=1)
undersampling_train_nonfraud = undersampling_train[undersampling_train['Class']==0].sample(300)
undersampling_train_fraud = undersampling_train[undersampling_train['Class']==1]
undersampling_train_total = pd.concat([undersampling_train_nonfraud,undersampling_train_fraud],axis=0)
undersampling_X = undersampling_train_total.drop("Class",axis=1)
undersampling_y = undersampling_train_total["Class"]
我们选择的方法是SVM
def confusion_matrix_1(CM):fig, ax = plot_confusion_matrix(conf_mat=CM)plt.title("The Confusion Matrix 1 of Undersampled dataset")plt.ylabel("Actual")plt.xlabel("Predicted")plt.show()print("The accuracy is "+str((CM[1,1]+CM[0,0])/(CM[0,0] + CM[0,1]+CM[1,0] + CM[1,1])*100) + " %")print("The recall from the confusion matrix is "+ str(CM[1,1]/(CM[1,0] + CM[1,1])*100) +" %")ss = SVC(kernel="linear")
ss.fit(undersampling_X,undersampling_y)
y_pred = ss.predict(X_test)
cmss = confusion_matrix(y_test, y_pred)
confusion_matrix_1(cmss)
The accuracy is 95.20519086542512 %
The recall from the confusion matrix is 87.09677419354838 %
95%的正确率看起来还不错,但我们在分析信用卡诈骗问题时,更多是用recall来衡量模型的准确度,而87%的recall看起来就有提升的空间了
调参
我们尝试使用GridSearchCV来调整SVM的参数
turned_parameters = [{'kernel':['linear','rbf','poly'],'gamma':['auto'],'C': [1,10,100,1000]}]
svm = GridSearchCV(SVC(), turned_parameters,cv=5,scoring='recall')
svm.fit(undersampling_X, undersampling_y)
print("Best parameters set found on Training dataset:")
print()
print(svm.best_params_)
由GridSearchCV,最合适的参数为{‘C’: 100, ‘gamma’: ‘auto’, ‘kernel’: ‘rbf’},我们使用这组参数来重新对数据集进行建模
{'C': 100, 'gamma': 'auto', 'kernel': 'rbf'}
The accuracy is 82.39796634925986 %
The recall from the confusion matrix is 94.35483870967742 %
虽然总的正确率下降,但94%的recall要明显优于原模型,故新模型要更加贴合数据。
用svm预测信用卡诈骗相关推荐
- matlab 股票 小波,小波分析 + 支持向量机(SVM)预测股票涨跌幅的实现
刚刚开始进入量化投资领域,最近在做金融数据方面的预测,用到了数据挖掘的知识,花了大概半个月的时间搞懂研报的思想,学习研报中提到的数据处理和机器学习算法,并实现了这个量化投资的核心模型部分,虽然结果显示 ...
- python机器交易_[原创]Python 机器学习之 SVM 预测买卖 -- 基于 BotVS 量化平台
Python 机器学习之 SVM 预测买卖 Python入门简单策略 sklearn 机器学习库的使用 回测系统自带的库有 numpy pandas TA-Lib scipy statsmodels ...
- 网购切莫小看1毛钱 暗藏信用卡诈骗玄机
淘宝.京东.团购网吸引了大量网民,网购的火爆的同时也乐翻了那些职业网上骗子.在百度知道.淘宝网控诉购物被骗的帖子比比皆是.钓鱼欺诈网站 严重威胁网购安全,网民在线购物时,可使用金山卫士.金山网盾防骗. ...
- svm预测结果为同一个值_实战:用SVM算法进行乳腺癌预测
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类(binary classification)的广义 ...
- svm预测结果为同一个值_SVM算法总结
一.1.感知机模型: 感知器模型是SVM.神经网络.深度学习等算法的基础;感知器模型就是试图找到一条直线,能够把所有的"+1"类和"-1"类分隔开,如果是高维空 ...
- python支持向量机 股票_小蛇学python(4)利用SVM预测股票涨跌
最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...
- 用MATLAB做SVM预测值一直变,Matlab的SVM预测结果很低,帮我看看原因吧? 数据代码都有。...
数据: 训练集 tr_117.txt 6.9888 0.0863 4.43E-09 5.4921 3.521 9.056 7.7013 0.0597 7.98E-08 5.4825 2.944 ...
- python作业——SVM预测交通流量
需求如下: 需要先安装以下库: # pip --default-timeout=1000 install numpy # pip --default-timeout=1000 install scip ...
- 【SVM预测】基于人工蜂群算法优化支持向量机SVM实现数据预测附Matlab代码
1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...
- 应用SVM预测澳大利亚降雨(含数据预处理与调参)
0 声明 本文主要内容来自视频'[2020机器学习全集]菜菜的sklearn完整版,价值4999元的最全机器学习sklearn全集,赶紧收藏_哔哩哔哩_bilibili',课件来自"http ...
最新文章
- 程序员,你就是三明治!
- MM中如何更改物料的评估类
- java thrift client_使用thrift的java client调用python server
- java nosql_使用NoSQL实现实体服务–第4部分:Java EE
- kotlin 二进制_Kotlin程序检查数字是否为二进制
- mfc指示灯报警显示_常用汽车仪表指示灯大全,看完再也不用担心不认识了
- nodejs实践录:测试连接性及邮件通知
- SQL Server 2008 R2:error 26 开启远程连接详解
- 简易云在线人事管理系统
- 博客搬家工具c/s实现方式
- cad标注桩号lisp_cad桩号标注插件下载
- 3D 打印开源软件 cura
- 串标是什么意思?用同一台电脑制作或上传投标书,会被认定为串标吗?
- scratch 编程 镜像画
- 平面几何----蝴蝶定理的证明
- vue3+vite2警告提示The above dynamic import cannot be analyzed by vite问题,vite中import动态引入
- 抖音小程序Tiktok开发教程之 基础组件 01 text文本组件
- Android应用各个开放平台市场
- 进程间通讯 rcf应用简介
- ApowerREC 1.2.4破解版 亲测能用
热门文章
- Md5(base64)加密与解密实战
- JAVA8 Swing 简单的桌面精灵(踩坑点记录)
- 【OpenCV笔记】光流法之金字塔Lucas-Kanade
- angular--安全导航操作符 ( ?. )、非空断言操作符(!) (实用)
- 【python】pycharts画关联图
- 致远OA漏洞学习——A6版本test.jsp 文件上传
- PVR个人视频录像机 - XBMC 12.0(Frodo)新功能
- js获取0-1之间的随机数,获取1-10之间的随机数
- 中国人应该知道的知识
- 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。