信用卡欺诈检测-Kaggle项目(一)数据探索与数据预处理

之前一直看机器学习的理论,上手实践太少了,为了尽快上手,所以找些Kaggle项目看看高Vote的怎么玩的,自己熟悉一下套路。
1. 对别人的分析过程做好过程分解 2. 每个单个步骤自己不参照的情况下重复 3. 套用到别的项目上

Credit Card Fraud Detection 问题描述和数据集都可以到官方的描述页面下载。信用卡欺诈检测问题的特点是样本的不均衡性,欺诈交易数量较少,所以可以训练一些不平衡样本的处理方式。


数据探索


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.gridspec as gridspec
import seaborn as sns

%matplotlib inline
data = pd.read_csv("./input/creditcard.csv")
data.head()



  • Time特征,是所有交易与第一个交易的时间间隔
  • V1-V28特征,是PCA后的特征,因为需要保密,所以不知道原始信息
  • Amount特征,是交易金额
  • Class是标签,1代表欺诈交易,0代表正常交易
data.describe()


data.isnull().sum()
Time      0
V1        0
V2        0
V3        0
V4        0
V5        0
V6        0
V7        0
V8        0
V9        0
V10       0
V11       0
V12       0
V13       0
V14       0
V15       0
V16       0
V17       0
V18       0
V19       0
V20       0
V21       0
V22       0
V23       0
V24       0
V25       0
V26       0
V27       0
V28       0
Amount    0
Class     0
dtype: int64


  • 没有空值方便,省去很多麻烦
print("Normal")
print(data.Time[data.Class==0].describe())
print("")
print("Fraud")
print(data.Time[data.Class==1].describe())
Normal
count    284315.000000
mean      94838.202258
std       47484.015786
min           0.000000
25%       54230.000000
50%       84711.000000
75%      139333.000000
max      172792.000000
Name: Time, dtype: float64

Fraud
count       492.000000
mean      80746.806911
std       47835.365138
min         406.000000
25%       41241.500000
50%       75568.500000
75%      128483.000000
max      170348.000000
Name: Time, dtype: float64
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(12, 4))

bins = 50

ax1.hist(data.Time[data.Class==1], bins=bins)
ax1.set_title("Fraud")

ax2.hist(data.Time[data.Class==0], bins=bins)
ax2.set_title("Normal")

plt.xlabel('Time')
plt.ylabel('Number of Transactions')
plt.show()



  • 欺诈交易看起来更均匀分布,而正常交易看起来则有交易周期,所以在正常交易的交易低频时间段更容易检测到欺诈交易
print("Normal")
print(data.Amount[data.Class==0].describe())
print("")
print("Fraud")
print(data.Amount[data.Class==1].describe())
Normal
count    284315.000000
mean         88.291022
std         250.105092
min           0.000000
25%           5.650000
50%          22.000000
75%          77.050000
max       25691.160000
Name: Amount, dtype: float64

Fraud
count     492.000000
mean      122.211321
std       256.683288
min         0.000000
25%         1.000000
50%         9.250000
75%       105.890000
max      2125.870000
Name: Amount, dtype: float64
f1, (ax3, ax4) = plt.subplots(2, 1, sharex=True, figsize=(12, 4))

bins = 30


ax3.hist(data.Amount[data.Class==1], bins=bins)
ax3.set_title("Fraud")

ax4.hist(data.Amount[data.Class==0], bins=bins)
ax4.set_title("Normal")




plt.xlabel("Amount($)")
plt.ylabel("Number of Transcations")
plt.yscale("log")
plt.show()



  • 欺诈交易和正常交易的分布相差很大,欺诈交易的最大值只有2125,相当且非常集中在小额交易中
  • Amount特征的均值和方差和V1-V28匿名特征的的分布相差较大,后续可以给Amount做个归一化
f2, (ax5, ax6) = plt.subplots(2, 1, sharex=True, figsize=(12,6))

ax5.scatter(data.Time[data.Class == 1], data.Amount[data.Class == 1])
ax5.set_title('Fraud')

ax6.scatter(data.Time[data.Class == 0], data.Amount[data.Class == 0])
ax6.set_title('Normal')

plt.xlabel('Time (in Seconds)')
plt.ylabel('Amount')
plt.show()



  • 信息和Time单独的数量直方图反应的差不多
# 选择所有匿名列
v_features = data.iloc[:,1:29].columns
plt.figure(figsize=(12,28*4))
gs = gridspec.GridSpec(28, 1)
for i, cn in enumerate(data[v_features]):
    ax = plt.subplot(gs[i])
    sns.distplot(data[cn][data.Class == 1], bins=50)
    sns.distplot(data[cn][data.Class == 0], bins=50)
    ax.set_xlabel('')
    ax.set_title('histogram of feature: ' + str(cn))
plt.show()



  • 可以看到很多特征的分布,欺诈交易和正常交易的分布非常相似,对分类的贡献应该很低。
数据探索主要是参照这篇notebook,是图画的比较好看,分析的也比较全面的一篇

数据预处理


  • 对Amount进行均一化操作
  • 对匿名特征,欺诈交易和正常交易分布相似的进行删除
  • 因为暂时没有对时间的分析,所以也先删除了
from sklearn.preprocessing import StandardScaler

data["normAmount"] = StandardScaler().fit_transform(data["Amount"].values.reshape(-1, 1))
data = data.drop(['Time', 'Amount','V28','V27','V26','V25','V24','V23','V22','V20','V15','V13','V8'], axis=1)
data.head()


以后的计划

果然一口气写一个大长篇对我来说太难了,中途总是遇到各种问题被卡住,然后就没有了。还是有点新进步就记录一下好,也算一种督促。当然欺诈检测这个项目才刚刚开始,慢慢探索,慢慢实验。。。
应该会有的内容?:
- 尝试各种重采样的方式
- 尝试Logistic回归、svm、决策树、XGBoost等模型的预测
- 尝试不同模型评价标准 recall、f1score、roc曲线、混淆矩阵

编辑于 2018-04-17