Credit Card Fraud Detection(信用卡诈欺侦测)Spark建模
背景
这个数据来自2013年9月欧洲信用卡交易数据,总共包括两天的交易数据。在284,807次交易中发现了492例诈骗。数据集极其不平衡,诈骗频率只占了交易频次的0.172%。
这个数据因为涉及敏感信息,用PCA处理过了,V1,V2,…V28是主成分,‘Time’和‘Amount’是没有经过PCA处理的。‘Time’是每次交易与第一次交易之间距离的时间,以秒计。‘Amount’代表消费金额,‘Class’代表响应变量,1代表欺诈,0代表正常。
数据格式
特征处理
读取数据
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
data = pd.read_csv("../input/creditcard.csv")
data.head()
先查看下有没有缺失值,通过查看,没有缺失值。如果有缺失值,可以用中位数或者平均数代替。
df.isnull().sum()
查看下类别属性的相关信息
print ("Fraud")
print (df.Amount[df.Class == 1].describe())
print ()
print ("Normal")
print (df.Amount[df.Class == 0].describe())
看下Amount特征和类别标签之间可能存在的关系
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(12,4))
bins = 30
ax1.hist(df.Amount[df.Class == 1], bins = bins)
ax1.set_title('Fraud')ax2.hist(df.Amount[df.Class == 0], bins = bins)
ax2.set_title('Normal')plt.xlabel('Amount ($)')
plt.ylabel('Number of Transactions')
plt.yscale('log')
plt.show()
从上面的图片中可以看出欺诈行为都发生在较小金额交易时,金额越小,欺诈交易次数也就越高。发生欺诈行为最高Amount的2125.87。因此这儿可以设置一个新的特征’Amount_max_fraud’,让他在2125.87以下设置为0,以上设置为1,这样便于区分类别标签。
df['Amount_max_fraud'] = 1
df.loc[df.Amount <= 2125.87, 'Amount_max_fraud'] = 0
df.head()
为了消除不同量纲之间的影响,将‘Amount’特征标准化形成新的特征‘normAmount’,时间特征在这明显是无用的,所以删除’Time’和‘Amount’两个特征。
from sklearn.preprocessing import StandardScaler
df['normAmount'] = StandardScaler().fit_transform(df['Amount'].reshape(-1, 1))
df = df.drop(['Time','Amount'],axis=1)
df.head()
查看类别分布
count_classes = pd.value_counts(data['Class'], sort = True).sort_index()
count_classes.plot(kind = 'bar')
plt.title("Fraud class histogram")
plt.xlabel("Class")
plt.ylabel("Frequency")
可以看到整个数据集极其不平衡,诈骗频率只占了交易频次的0.172%。如何去处理这个不平衡问题,可以从数据和算法两个层面入手。
1、数据层面:欠采样、过采样、欠采样和过采样结合
2、算法层面:集成学习、代价敏感、特征选择
这里从数据层面入手。使用SMOTE算法做数据过采样。对SMOTE算法的介绍可以看我的这篇博客。这里先将数据进行划分,70%用于训练。
from imblearn.over_sampling import SMOTE
from sklearn.cross_validation import train_test_split
def data_prepration(x): x_features= x.ix[:,x.columns != "Class"]x_labels=x.ix[:,x.columns=="Class"] x_features_train,x_features_test,x_labels_train,x_labels_test = train_test_split(x_features,x_labels,test_size=0.3)print("length of training data")print(len(x_features_train))print("length of test data")print(len(x_features_test))return(x_features_train,x_features_test,x_labels_train,x_labels_test)
data_train_X,data_test_X,data_train_y,data_test_y=data_prepration(df)
print pd.value_counts(data_test_y['Class'])
#调用smote
os = SMOTE(random_state=0)
os_data_X,os_data_y=os.fit_sample(data_train_X.values,data_train_y.values.ravel())
现在再来看下整体的数据分布。
from __future__ import division
columns = data_train_X.columns
os_data_X = pd.DataFrame(data=os_data_X,columns=columns )
print len(os_data_X)
os_data_y= pd.DataFrame(data=os_data_y,columns=["Class"])
# 现在检查下抽样后的数据
print("length of oversampled data is ",len(os_data_X))
print("Number of normal transcation",len(os_data_y[os_data_y["Class"]==0]))
print("Number of fraud transcation",len(os_data_y[os_data_y["Class"]==1]))
print("Proportion of Normal data in oversampled data is ",len(os_data_y[os_data_y["Class"]==0])/len(os_data_X))
print("Proportion of fraud data in oversampled data is ",len(os_data_y[os_data_y["Class"]==1])/len(os_data_X))
可以看到这个数据经过过采样后数据达到了整体的平衡。然后可以将过采样后的训练数据和没有采样的测试数据写入csv文件以方便在spark上处理。
newtraindata=pd.concat([os_data_X,os_data_y],axis=1)
newtestdata=pd.concat([data_test_X,data_test_y],axis=1)
newtraindata.to_csv('./creditcard/train.csv',sep=',')
newtestdata.to_csv('./creditcard/test.csv',sep=',')
然后这儿得到了两个文件,下面就是将文件放到spark上去执行。
Spark建模
1、启动hadoop和spark。
2、上传两个文件到hdfs上。
hdfs dfs -put train.csv /user
hdfs dfs -put test.csv /user
3、使用jupyter notebook去启动pyspark shell。
import os
execfile(os.path.join(os.environ["SPARK_HOME"], 'python/pyspark/shell.py'))
出现如图所示代表连接成功。
4、读取hdfs上的两个文件
train= sc.textFile("hdfs:///user/train.csv")
test = sc.textFile("hdfs:///user/test.csv")
print train.count(),test.count()
5、将csv文件格式转成LabeledPoint格式
from pyspark.mllib.regression import LabeledPoint
def parsePoint(line):values = [float(x.strip()) for x in line.split(',')]return LabeledPoint(values[-1],values[:30])
train_parsed = train.map(parsePoint)
test_parsed = test.map(parsePoint)
6、建模,这里使用决策树模型
from pyspark.mllib.tree import DecisionTree, DecisionTreeModel
#Train a DecisionTree model.
#Empty categoricalFeaturesInfo indicates all features are continuous.
model = DecisionTree.trainClassifier(train_parsed, numClasses=2, categoricalFeaturesInfo={}, impurity='gini', maxDepth=5, maxBins=32)
具体的参数调优过程不做详细介绍。建立模型之后可以打印这个模型信息看看。
print('Learned classification tree model:')
print(model.toDebugString())
7、评估这个模型的效果
#计算这个模型在测试集上的误差
predictions = model.predict(test_parsed.map(lambda x: x.features))
PredictionsAndLabels = predictions.zip(test_parsed.map(lambda lp: lp.label))
testErr = PredictionsAndLabels.filter(lambda (v, p): v != p).count() / float(test_parsed.count())
print('Test Error = ' + str(testErr))from pyspark.mllib.evaluation import BinaryClassificationMetrics
metrics = BinaryClassificationMetrics(PredictionsAndLabels)
#计算ROC曲线下的面积即AUC值
print("Area under ROC = %s" % metrics.areaUnderROC)
Credit Card Fraud Detection(信用卡诈欺侦测)Spark建模相关推荐
- Credit Card Fraud Detection(信用卡欺诈检测相关数据集)
原文: Credit Card Fraud Detection Anonymized credit card transactions labeled as fraudulent or genuine ...
- 论文 | Credit Card Fraud Detection Using Convolutional Neural Networks
本篇博客继续为大家介绍一篇论文,也是关于用卷积神经网络 CNN 来进行信用卡欺诈检测的. 论文信息 论文题目:Credit card fraud detection using convolution ...
- TensorFlow for Hackers (Part VII) - Credit Card Fraud Detection using Autoencoders in Keras
It's Sunday morning, it's quiet and you wake up with a big smile on your face. Today is going to be ...
- 4.实操(Credit Card Fraud Detection)
目录 一.数据挖掘流程 二.Data Preview 2.1 data. shape 2.2 data. head() 2.3 data.describe() 2.4 check NaN 2.5 Cl ...
- credit card fraud detection
概述 本文为机器学习入门贴,一方面作为自己的学习记录,另一方面,作为入门级代码分享,希望能给一些同学带来一点点帮助.欢迎指正交流. 摘要 本文以[kaggle信用卡欺诈判别原数据]为学习对象,利用决策 ...
- Kaggle系列-IEEE-CIS Fraud Detection第一名复现
赛题背景 想象一下,站在杂货店的收银台,身后排着长队,收银员没有那么安静地宣布您的信用卡被拒绝了.在这一刻,你可能没有想到决定你命运的数据科学. 非常尴尬有木有?当然你肯定有足够的资金为50个最亲密的 ...
- Python:实现测试信用卡号码有效性credit card validator的算法(附完整源码)
Python:实现测试信用卡号码有效性credit card validator的算法 def validate_initial_digits(credit_card_number: str) -&g ...
- (原创)北美信用卡(Credit Card)个人使用心得与总结(个人理财版) [精华]
http://forum.chasedream.com/thread-766972-1-1.html 本人2010年 8月F1 二度来美,现在credit score 在724-728之间浮动,最高的 ...
- Federated Meta-Learning for Fraudulent Credit Card Detection
Federated Meta-Learning for Fraudulent Credit Card Detection Introduction Life-long
最新文章
- IDE接口驱动程序移植
- [git/svn]Git和SVN差异
- Hyperledger Fabric 链码(0) 说明
- np.nonzero()函数的解析
- .NET Windows服务应用程序
- 自定义Valid注解,校验List集合
- 排序算法(6)----计数排序
- PTA-基础编程题目集-函数题 ……
- 14Penrose广义逆(II)
- 自动化测试产品-售后服务方案策略与实施
- mysql查询各科成绩前三名_No.03 数据库经典面试之如何取出每科成绩的前三名
- 计算机wps文字背景怎么设置,如何在wps文本中添加背景以及如何将图片设置为页面背景...
- html表格可以包含多个tbody,使用Ajax呈现具有多个tbody元素的HTML表格
- 多款AGV模型3D图纸 零件图,装配图都有 潜伏式,搬运AGV,内部结构详细
- 怎么用显卡计算_初试CUDA,入门显卡实现两千倍加速
- 《数据挖掘》读书笔记2、3章节
- 企业如何借助制造业ERP系统,做好生产排产管理?
- matplotlib绘图颜色大全
- 06年注册安全工程师试题
- Linux基本防护措施案例\使用sudo分配管理权限案例\提高SSH服务安全案例\SELinux安全防护\Linux基本防护措施