目录

  • 一、数据挖掘流程
  • 二、Data Preview
    • 2.1 data. shape
    • 2.2 data. head()
    • 2.3 data.describe()
    • 2.4 check NaN
    • 2.5 Class Distribution
    • 2.6 correlation heatmap
  • 三、问题+方案
    • 3.1 发现的问题
    • 3.2 方案
  • 四、Data Preprocessing
    • 4.1 Standardization
    • 4.2 Under sample
    • 4.3 Data split
    • 4.4 SMOTE
  • 五、模型构建
    • 5.1 Logistic Regression
    • 5.2 使用undersample后的测试数据进行评估
    • 5.3 对原始数据的测试集进行评估
    • 5.4 使用SMOTE训练
    • 5.5 结合undersample 和 SMOTE

一、数据挖掘流程

  • 加载数据
  • 观察数据结构,分布,有哪些问题
  • 针对问题提出不同的解决方案
  • 数据预处理
  • 数据集切分
  • 选择评估方法
  • 构造模型
  • 建模结果记录+分析
  • 方案对比

二、Data Preview

2.1 data. shape

(284807, 31)

2.2 data. head()

  • 可以看出属性有 Time,V1 - V28, Amount组成
  • 除了Amount其他的都经过Standardization
  • Time属性没用,以后删掉
  • Amount 不知道需不需要进行标准化scaling

2.3 data.describe()

data.descirbe(include='all')

可以看到Amount的统计量:

  • mean:88.34
  • std:250
  • min:0
  • 25%:5.6
  • 50%:22
  • 75%:77.2
  • max:25691

2.4 check NaN

此案例没有缺失值

2.5 Class Distribution

0 : 284315 (99.8%)
1 : 492 (0.2%)
isFraud发生的极其少,数据极不平衡,之后需要SMOTE或者Under sample

2.6 correlation heatmap

import seaborn as sns
corr = data.corr()  #传入要看相关性的属性或全部列data.corr()
plt.figure(figsize=(15,15))
sns.heatmap(corr,square=True) ##annot=Ture 显示每个方格的数据  fmt参数控制字符属性
plt.show()

看不出有哪些属性有着很强的相关性,很大程度可能是因为极度imbalance的缘故造成的

三、问题+方案

3.1 发现的问题

  1. Time 属性没用
  2. Amount 的数据值范围比别的属性要大很多,要进行standardization变换
  3. 数据class极度不平衡,需要进行过采样或下采样

3.2 方案

通用的预处理:

  1. 删除Time属性
  2. 对Amount进行Standardization
  3. 平衡数据
    3.1 SMOTE
    3.2 Under sample
    3.3 先将notFraud的样本Undersample到六七百的数量,再进行SMOTE

四、Data Preprocessing

4.1 Standardization

from sklearn.preprocessing import StandardScaler
data['Amount'] =  StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))

如果fit_transform传入的数据只有一列需要加values.reshape(-1,1)

4.2 Under sample

# undersample 抽取data中所有的fraud 样本400多个,然后在剩下的class=0的样本中sample相等数量的样本就行
fraud_data = data[data["Class"]==1]   # fraud_data dataframe
number_records_fraud = len(fraud_data) # how many fraud samples:492
not_fraud_data = data[data["Class"]==0].sample(n=number_records_fraud)
training_data_1 = pd.concat([fraud_data,not_fraud_data])

tips:这里新生成的training_data_1的索引是未经过重排序的,是乱的

进行feature和class的分离

X_under = training_data_1.drop(['Class'],axis=1)
y_under = training_data_1['Class']

经过under sample的数据集,看下个属性的相关性热力图
很明显看出V16-V18正相关性很强,V1V2还有一些属性负相关性很强

4.3 Data split

对原始数据进行分离

from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=33)

对undersample的数据进行分离

train_x_under, test_x_under, train_y_under, test_y_under = train_test_split(X_under, y_under, test_size=0.3, random_state=33)

4.4 SMOTE

from imblearn.over_sampling import SMOTE,ADASYN
features_data,label_data = SMOTE().fit_resample(features_data,np.ravel(label_data))
X_smote,y_smote = SMOTE(random_state=33).fit_resample(X,np.ravel(y))
X_smote = pd.DataFrame(X_smote,columns=features_name)
y_smote = pd.DataFrame({"Class":y_smote})

五、模型构建

5.1 Logistic Regression

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
parameters={'penalty':['l1','l2'],'C':[0.01,0.1,1,3,10]}
#C是惩罚力度,与直觉相反,C越小惩罚力度越大clf = LogisticRegression(n_jobs=-1)
model = GridSearchCV(estimator=clf,param_grid=parameters,cv=8,n_jobs=-1,scoring='recall')
model.fit(train_x_under,train_y_under)
print(model.best_score_)
print(model.best_params_)

往GridSearchCV传入不同的评估指标recall 和 Auc
AUC = 0.979185745056816 {‘C’:1, ‘penalty’: ‘l1’} LogisticRegression
Recall = 0.9105691056910569 {‘C’: 0.01, ‘penalty’: ‘l1’} LogisticRegression

5.2 使用undersample后的测试数据进行评估

train_x_under, test_x_under, train_y_under, test_y_under
clf = LogisticRegression(C=1,penalty='l1')
clf.fit(train_x_under,train_y_under)
predict = clf.predict(test_x_under)

再使用evaluate方法

5.3 对原始数据的测试集进行评估

train_x, test_x, train_y, test_y
clf = LogisticRegression(C=1,penalty='l1')
clf.fit(train_x,train_y)
predict = clf.predict(test_x)
evaluate(predict,test_y,[0,1])

fraud的recall rate偏低,所有151个fraud样本中只有62%被找出来

5.4 使用SMOTE训练

SMOTE过后的数据 0:1 = 28万:28万

clf = LogisticRegression(C=0.01,penalty='l1')
clf.fit(X_smote,y_smote)
predict = clf.predict(test_x)

误报率提高了好多,正常的被分类成fraud的有2000多个

5.5 结合undersample 和 SMOTE

先将notFraud的undersample到700,这样0:1 = 700:492
再进行SMOTE,就变成700:700,拿这个数据进行训练

4.实操(Credit Card Fraud Detection)相关推荐

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

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

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

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

  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. Credit Card Fraud Detection(信用卡诈欺侦测)Spark建模

    背景 这个数据来自2013年9月欧洲信用卡交易数据,总共包括两天的交易数据.在284,807次交易中发现了492例诈骗.数据集极其不平衡,诈骗频率只占了交易频次的0.172%. 这个数据因为涉及敏感信 ...

  5. credit card fraud detection

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

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

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

  7. Federated Meta-Learning for Fraudulent Credit Card Detection

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

  8. 【联邦元学习】论文解读:Federated Meta-Learning for Fraudulent Credit Card Detection

    论文:Zheng W, Yan L, Gou C, et al. Federated Meta-Learning for Fraudulent Credit Card Detection[C], Pr ...

  9. 【数据竞赛】可能是全网特征工程实操最通透的...

    之前在我写的特征工程方法论里面提了一嘴,用automl搜索+人工启启发式可以高效稳定地完成特征工程,并取得不错的效果. 原文:可能是全网写特征工程最通透的... 不过这篇文章最大的问题是太过于侧重于是 ...

最新文章

  1. IHttpHandler的学习(0-2)
  2. Stanford UFLDL教程 从自我学习到深层网络
  3. UVA 10601 Cubes
  4. 欢乐纪中某B组赛【2019.1.29】
  5. java 注解 target_详解JDK 5 Annotation 注解之@Target的用法
  6. (最小生成树)prim算法
  7. Python 基本语法规则
  8. grub rescue修复
  9. leetcode 动态规划 —— 53(最大子序列的和)
  10. 关于二进制兼容(二进制边界)的解释
  11. HashMap 的底层源码分析
  12. jmeter在返回的json串中提取需要的值
  13. 【迅速上手】Python 画图 —— 箱图与密度图
  14. 福昕pdf套件注册码激活
  15. 速学 | 如何帮女朋友用Java合并两个PDF
  16. 朱丹老师课程学习笔记:1、信息搜索-全面快速查找全网中你想要的任何信息
  17. windows下Graphviz安装及入门教程(附下载链接)
  18. Unity文档——AssetBundle使用模式
  19. osgEarth测高程方法
  20. 微信小程序之picker选择器获取值得两种方法

热门文章

  1. Java开发基础——配置文件的写入与读取
  2. 那时本该像风一样把你忘记
  3. Yura2020年限量高级定制版阅读进度表
  4. 小狐狸被抛弃?火狐浏览器官网域名仍为firefox.com.cn
  5. 这首王维的古诗该如何解析?
  6. 服务器磁盘爆满的问题定位流程与命令汇总
  7. 关于VERIFY_OCTAL_PERMISSIONS权限检查
  8. 如何进行团队建设以保持团队稳定?
  9. 墨画子卿第三章第7节:备战
  10. 计算机网络连接显示678是什么意思,宽带连接错误678,教您宽带连接出现错误提示代码678怎么解决...