数据集来源于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预测信用卡诈骗相关推荐

  1. matlab 股票 小波,小波分析 + 支持向量机(SVM)预测股票涨跌幅的实现

    刚刚开始进入量化投资领域,最近在做金融数据方面的预测,用到了数据挖掘的知识,花了大概半个月的时间搞懂研报的思想,学习研报中提到的数据处理和机器学习算法,并实现了这个量化投资的核心模型部分,虽然结果显示 ...

  2. python机器交易_[原创]Python 机器学习之 SVM 预测买卖 -- 基于 BotVS 量化平台

    Python 机器学习之 SVM 预测买卖 Python入门简单策略 sklearn 机器学习库的使用 回测系统自带的库有 numpy pandas TA-Lib scipy statsmodels  ...

  3. 网购切莫小看1毛钱 暗藏信用卡诈骗玄机

    淘宝.京东.团购网吸引了大量网民,网购的火爆的同时也乐翻了那些职业网上骗子.在百度知道.淘宝网控诉购物被骗的帖子比比皆是.钓鱼欺诈网站 严重威胁网购安全,网民在线购物时,可使用金山卫士.金山网盾防骗. ...

  4. svm预测结果为同一个值_实战:用SVM算法进行乳腺癌预测

    支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类(binary classification)的广义 ...

  5. svm预测结果为同一个值_SVM算法总结

    一.1.感知机模型: 感知器模型是SVM.神经网络.深度学习等算法的基础;感知器模型就是试图找到一条直线,能够把所有的"+1"类和"-1"类分隔开,如果是高维空 ...

  6. python支持向量机 股票_小蛇学python(4)利用SVM预测股票涨跌

    最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...

  7. 用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 ...

  8. python作业——SVM预测交通流量

    需求如下: 需要先安装以下库: # pip --default-timeout=1000 install numpy # pip --default-timeout=1000 install scip ...

  9. 【SVM预测】基于人工蜂群算法优化支持向量机SVM实现数据预测附Matlab代码

    1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...

  10. 应用SVM预测澳大利亚降雨(含数据预处理与调参)

    0 声明 本文主要内容来自视频'[2020机器学习全集]菜菜的sklearn完整版,价值4999元的最全机器学习sklearn全集,赶紧收藏_哔哩哔哩_bilibili',课件来自"http ...

最新文章

  1. 程序员,你就是三明治!
  2. MM中如何更改物料的评估类
  3. java thrift client_使用thrift的java client调用python server
  4. java nosql_使用NoSQL实现实体服务–第4部分:Java EE
  5. kotlin 二进制_Kotlin程序检查数字是否为二进制
  6. mfc指示灯报警显示_常用汽车仪表指示灯大全,看完再也不用担心不认识了
  7. nodejs实践录:测试连接性及邮件通知
  8. SQL Server 2008 R2:error 26 开启远程连接详解
  9. 简易云在线人事管理系统
  10. 博客搬家工具c/s实现方式
  11. cad标注桩号lisp_cad桩号标注插件下载
  12. 3D 打印开源软件 cura
  13. 串标是什么意思?用同一台电脑制作或上传投标书,会被认定为串标吗?
  14. scratch 编程 镜像画
  15. 平面几何----蝴蝶定理的证明
  16. vue3+vite2警告提示The above dynamic import cannot be analyzed by vite问题,vite中import动态引入
  17. 抖音小程序Tiktok开发教程之 基础组件 01 text文本组件
  18. Android应用各个开放平台市场
  19. 进程间通讯 rcf应用简介
  20. ApowerREC 1.2.4破解版 亲测能用

热门文章

  1. Md5(base64)加密与解密实战
  2. JAVA8 Swing 简单的桌面精灵(踩坑点记录)
  3. 【OpenCV笔记】光流法之金字塔Lucas-Kanade
  4. angular--安全导航操作符 ( ?. )、非空断言操作符(!) (实用)
  5. 【python】pycharts画关联图
  6. 致远OA漏洞学习——A6版本test.jsp 文件上传
  7. PVR个人视频录像机 - XBMC 12.0(Frodo)新功能
  8. js获取0-1之间的随机数,获取1-10之间的随机数
  9. 中国人应该知道的知识
  10. 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。