机器学习实战:基于逻辑回归模型的信用卡欺诈检测机器学习实战:基于逻辑回归模型的信用卡欺诈检测
某银行为提升信用卡反欺诈检测能力,提供了脱敏后的一份个人交易记录。考虑数据本身的隐私性,数据提供之初已经进行了
类似PCA的处理,并得到了若干数据特征。在不需要做额外特征提取工作的情况下,本项目意在通过逻辑回归模型的调优,
得到较为准确可靠的反欺诈检测方法,分析过程中使用到了Python Pandas, Numpy, Matplotlib, Seaborn以及机器学习库
Scikit-Learn等。
数据链接:
链接:https://pan.baidu.com/s/11uT0CHYPenX_67qTdr-Tjg
密码:b9xo
完整代码实现如下:
下采样完整代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold,cross_val_score #cross_val_score交叉验证
from sklearn.metrics import confusion_matrix,recall_score,classification_report
from sklearn.model_selection import cross_val_predict
data = pd.read_csv('/Users/hxx/Downloads/creditcard.csv')
print(data.head())
#查看数据样本是否均衡(正负样本是否均衡)
pd.value_counts(data['Class'],sort=True).sort_index()
#print(pd.value_counts(data['Class'],sort=True).sort_index())#value_count计算某列属性中属性不为1的值有多少个
count_classes = pd.value_counts(data['Class'],sort=True).sort_index()#value_counts()是一种查看表格某列中有多少个不同值
的快捷方法,并计算每个不同值有在该列中有多少重复值。
count_classes.plot(kind='bar')##简单的pandas也可以画图,kind=bar画的条状图,kind=line画的线性图
plt.title('Fraud class histogrm')
plt.xlabel('Class')
plt.ylabel('Frequency')
plt.show()
#从上图中可以发现,正反数据比例不均衡,因此引入采样对数据进行调整
#采样分为下采样和上采样,下采样就是对数据量大的进行减少,上采样就是对数据量较少的进行添加数据
# 预处理
#我们从数据中发现Amount这个属性对应的数据值与其他属性数据相差过大,因此进行标准化处理
#标准化就是对数据先减去均值在处以标准差,去均值的好处使数据关于原点对称,除以标准差好处使各个维度的数据取值范
围尽可能的相同
data['normAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))
#Fit()简单来说,就是求得训练集X的均值啊,方差啊,最大值啊,最小值啊这些训练集X固有的属性。可以理解为一个训练过
程
#Transform()在Fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)
#fit_transform(Data)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等,然后对Data进行转换
transform,从而实现数据的标准化、归一化等等
#reshape(a,b)函数中a代表行数,b代表列数,就是转换成a行b列,但是-1代表未指定,因此这边normAmount就是多少行一
列的数据
data = data.drop(['Time','Amount'],axis=1)#去掉Time列和Amount列,axis=1代表的列
print(data.head())
# 下采样
X = data.iloc[:,data.columns != 'Class'] y = data.iloc[:,data.columns == 'Class'] #data.iloc函数是基于位置索引,添加条件进行
过滤
number_records_fraud = len(data[data.Class==1])
fraud_indices = np.array(data[data.Class==1].index)#用一个数组将class==1的对应的索引记录下来
normal_indices = np.array(data[data.Class==0].index)#得到class==0的对应的索引
#随机选取class==1的索引,个数为class==1的个数
random_normal_indices = np.random.choice(normal_indices,number_records_fraud,replace=False)#replace指定为False
时,采样不会重复
#将class==1和class==0的索引集合起来
under_sample_data = np.concatenate([fraud_indices,random_normal_indices])
评论1