在数字支付日益普及的今天,信用卡欺诈成为了一个不容忽视的问题。幸运的是,机器学习为我们提供了一种强大的工具来识别和预防这类欺诈行为。在这篇文章中,我将介绍如何使用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和机器学习来构建一个信用卡欺诈检测系统。从数据预处理到模型评估,我们遵循了一个完整的机器学习工作流程。通过调整模型参数和评估模型性能,我们可以优化模型以提高欺诈检测的准确性。