利用Python和机器学习检测银行贷款信用卡欺诈

在数字支付日益普及的今天,信用卡欺诈成为了一个不容忽视的问题。幸运的是,机器学习为我们提供了一种强大的工具来识别和预防这类欺诈行为。在这篇文章中,我将介绍如何使用Python和机器学习来构建一个信用卡欺诈检测系统。

简介

信用卡欺诈检测是一个典型的二分类问题,目标是识别交易是否为欺诈。在这个项目中,我们将使用逻辑回归模型,这是一种简单而有效的分类算法。此外,我们还将使用交叉验证来选择最佳的模型参数,以提高模型的泛化能力。

从数据预处理到模型评估

代码

import pandas as pd #pd
"""第一步:数据预处理,要读取,
        已经进行了数据脱敏处理,(数据脱敏的含义:)
"""
data = pd.read_csv(r"./creditcard.csv")
print(data.head())#前5行的数据

from sklearn.preprocessing import StandardScaler#z标准化的函数

scaler =  StandardScaler() #实例化 标准化 对象scaler
a = data[['Amount']]
b = data['Amount']
data['Amount'] = scaler.fit_transform(data[['Amount']])
print(data.head())#打印data这个表格数据的前5行
data = data.drop(['Time'],axis=1)  #删除Time列的内容,axis为1表示列

"""绘制图形,查看正负样本个数"""
import matplotlib.pyplot as plt
from pylab import mpl #matplotlib不能显示中文,借助于pylab实现中文显示

mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #显示中文
mpl.rcParams['axes.unicode_minus'] = False
labels_count = pd.value_counts(data['Class']) #统计data['class']中每类的个数
print(labels_count)
plt.title("正负例样本数")  #设置标题#
plt.xlabel("类别")       #设置x轴标题
plt.ylabel("频数")      #设置y轴标题
labels_count.plot(kind='bar')  #设置图像类型为bar
plt.show()              #显示数据极度样本不均衡

"""建立模型"""
from sklearn.model_selection import train_test_split  #专门用来对数据集进行切分的函数
#对原始数据集进行切分
X_whole = data.drop('Class',axis=1)  #删除class列,其余数据作为特征集
y_whole = data.Class                       #class列作为标签(label标注)
#返回的4个值,第1个:训练数据集的x特征,第2个:测试数据集的x特征。第3个:训练数据集的标签,第4个:测试数据集的标签,
x_train_w, x_test_w,y_train_w, y_test_w = \
        train_test_split(X_whole, y_whole, test_size = 0.3, random_state = 1000)



from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=0.01)  #先调用这个类创建一个逻辑回归对象lr
lr.fit(x_train_w, y_train_w)     #传入训练数据,之后的模型就会自动保存到变量r
"""训练集预测结果"""
test_predicted = lr.predict(x_test_w) #测试集
result = lr.score(x_test_w,y_test_w) #准确率
#获取分类结果报告
from sklearn import metrics
print(metrics.classification_report(y_test_w, test_predicted))



运行结果

这将首先打印出类别0(非欺诈)和类别1(欺诈)的样本数量。然后,将显示一个条形图,图中显示两个类别的样本数量。通常,非欺诈交易的数量会远远大于欺诈交易的数量。

这将输出一个分类报告,包括以下指标:

    准确率(Precision):模型正确预测的样本数占总样本数的比例

  • 精确率(Precision):正确预测的正例占所有预测为正例的比例。

  • zh

  • 召回率(Recall):正确预测的正例占所有实际为正例的比例。

  • F1分数(F1-score):精确率和召回率的调和平均数。

  • 支持度(Support):每个类别的实际出现次数。

对于信用卡欺诈检测,通常更关注召回率,因为我们希望尽可能多地识别出欺诈交易,即使这可能会增加误报的数量。

模型训练与参数调优

代码

import pandas as pd
import matplotlib.pyplot as plt
import scores
from pylab import mpl
import numpy as np

#绘制可视化混淆矩阵
def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y,yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',
                         verticalalignment = 'center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

"""第一步:数据预处理"""
data = pd.read_csv(r"./creditcard.csv")

"""绘制图形,查看正负样本归属"""

"""数据标准化:Z标准化"""
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
a = data[['Amount']]#返回dataframe数据,而不是series。
data['Amount'] = scaler.fit_transform(data[['Amount']])

data = data.drop(['Time'],axis=1)#删除无用列

"""训练集使用下采样数据,测试集使用原始数据进行预测"""
from sklearn.model_selection import train_test_split

#对采样数据划分
X = data.drop(['Class'],axis=1)  #对data_c数据进行划分。
y = data.Class
x_train, x_test, y_train, y_test = \
    train_test_split(X, y, test_size = 0.3, random_state = 0)
...
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score #交叉验证的函数

#交又验证选择较优惩罚因子
scores = []
c_param_range = [0.01,0.1,1,10,100] #参数
for i in c_param_range: #第1词循环的时候C=0.01,5个逻辑回归模型
    lr = LogisticRegression(C =i,penalty = 'l2',solver='lbfgs', max_iter=1000)
    score = cross_val_score(lr, x_train, y_train, cv=8, scoring='recall')#交叉验证
    score_mean = sum(score)/len(score)  #交叉验证后的值召回率
    scores.append(score_mean)  #里面保存了所有的交叉验证回归率
    print(score_mean)  #将不同的c参数分别传入模型,分别看看哪个模型效果更好,我们选c

best_c = c_param_range[np.argmax(scores)]  #寻找到scores中最大值的对应的C参数

"""建立最优模型"""
lr = LogisticRegression(C = best_c,penalty = 'l2', max_iter = 1000)#c=【100,10, 1, 0.1, 0.01】
lr.fit(x_train,y_train)

#绘制混淆矩阵
from sklearn import metrics
train_predicted = lr.predict(x_train)#自测
print(metrics.classification_report(y_train, train_predicted))
cm_plot(y_train,train_predicted).show()

# # “"叫
# # 使用测试集数据进行测试# # “""
#预测结果
test_predicted = lr.predict(x_test)#小的数据集进行测试
#绘制混淆矩阵
print(metrics.classification_report(y_test, test_predicted))
cm_plot(y_test,test_predicted).show()#小的数据集的报告
...







运行结果

交叉验证选择最优惩罚因子: 通过循环不同的 C 值,使用逻辑回归模型和8折交叉验证来计算每个 C 值的平均召回率。每次循环都会打印出一个 C 值对应的平均召回率。最终,会找到使召回率最大化的 C 值。

模型评估和混淆矩阵: 使用训练集数据进行自测,并打印分类报告和绘制混淆矩阵。分类报告包括主要的分类指标,如精确度、召回率、F1分数等

混淆矩阵图会显示在一个新的窗口中,其中x轴代表预测标签,y轴代表真实标签。

测试集评估: 使用测试集数据进行预测,并打印分类报告和绘制混淆矩阵。这一步的输出与训练集评估类似,但反映了模型在未见数据上的性能。

注意  :由于数据集可能存在类别不平衡(欺诈交易远少于正常交易),模型可能会倾向于预测多数类(正常交易),导致召回率较低。此外,混淆矩阵中的数值将显示模型在各个类别上的预测准确性。

结论

通过这个项目,我们展示了如何使用Python和机器学习来构建一个信用卡欺诈检测系统。从数据预处理到模型评估,我们遵循了一个完整的机器学习工作流程。通过调整模型参数和评估模型性能,我们可以优化模型以提高欺诈检测的准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值