背景

这个数据来自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建模相关推荐

  1. Credit Card Fraud Detection(信用卡欺诈检测相关数据集)

    原文: Credit Card Fraud Detection Anonymized credit card transactions labeled as fraudulent or genuine ...

  2. 论文 | Credit Card Fraud Detection Using Convolutional Neural Networks

    本篇博客继续为大家介绍一篇论文,也是关于用卷积神经网络 CNN 来进行信用卡欺诈检测的. 论文信息 论文题目:Credit card fraud detection using convolution ...

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

  5. credit card fraud detection

    概述 本文为机器学习入门贴,一方面作为自己的学习记录,另一方面,作为入门级代码分享,希望能给一些同学带来一点点帮助.欢迎指正交流. 摘要 本文以[kaggle信用卡欺诈判别原数据]为学习对象,利用决策 ...

  6. Kaggle系列-IEEE-CIS Fraud Detection第一名复现

    赛题背景 想象一下,站在杂货店的收银台,身后排着长队,收银员没有那么安静地宣布您的信用卡被拒绝了.在这一刻,你可能没有想到决定你命运的数据科学. 非常尴尬有木有?当然你肯定有足够的资金为50个最亲密的 ...

  7. Python:实现测试信用卡号码有效性credit card validator的算法(附完整源码)

    Python:实现测试信用卡号码有效性credit card validator的算法 def validate_initial_digits(credit_card_number: str) -&g ...

  8. (原创)北美信用卡(Credit Card)个人使用心得与总结(个人理财版) [精华]

    http://forum.chasedream.com/thread-766972-1-1.html 本人2010年 8月F1 二度来美,现在credit score 在724-728之间浮动,最高的 ...

  9. Federated Meta-Learning for Fraudulent Credit Card Detection

    Federated Meta-Learning for Fraudulent Credit Card Detection Introduction Life-long

最新文章

  1. IDE接口驱动程序移植
  2. [git/svn]Git和SVN差异
  3. Hyperledger Fabric 链码(0) 说明
  4. np.nonzero()函数的解析
  5. .NET Windows服务应用程序
  6. 自定义Valid注解,校验List集合
  7. 排序算法(6)----计数排序
  8. PTA-基础编程题目集-函数题 ……
  9. 14Penrose广义逆(II)
  10. 自动化测试产品-售后服务方案策略与实施
  11. mysql查询各科成绩前三名_No.03 数据库经典面试之如何取出每科成绩的前三名
  12. 计算机wps文字背景怎么设置,如何在wps文本中添加背景以及如何将图片设置为页面背景...
  13. html表格可以包含多个tbody,使用Ajax呈现具有多个tbody元素的HTML表格
  14. 多款AGV模型3D图纸 零件图,装配图都有 潜伏式,搬运AGV,内部结构详细
  15. 怎么用显卡计算_初试CUDA,入门显卡实现两千倍加速
  16. 《数据挖掘》读书笔记2、3章节
  17. 企业如何借助制造业ERP系统,做好生产排产管理?
  18. matplotlib绘图颜色大全
  19. 06年注册安全工程师试题
  20. Linux基本防护措施案例\使用sudo分配管理权限案例\提高SSH服务安全案例\SELinux安全防护\Linux基本防护措施

热门文章

  1. 7-6 jmu-Java-03面向对象-06-继承覆盖综合练习
  2. idea 全局搜索不到,原来是你的原因
  3. 曲线拟合最小二乘法优缺点_对最小二乘法拟合曲线的简单说明
  4. vscode使用问题合集
  5. Windows10禁止自动重启和按键盘任意键自动开机
  6. 弥散阴影html,设计弥散阴影效果海报图片的PS实例教程
  7. 崮德好文连载 - 活该你是工程师(关于危机感)
  8. linux读取spd信息,linux怎样读取memory spd
  9. JAVA对图片进行等比/非等比压缩处理
  10. 腾讯会议多开一个账号同时登陆手机和电脑