用Python实现SVM搭建金融反诈模型(含调试运行)
1.概述
信用卡盗刷一般发生在持卡人信息被不法分子窃取后,复制卡片进行消费或信用卡被他人冒领后激活并消费等情况下。一旦发生信用卡盗刷,持卡人和银行都会遭受一定的经济损失。本节要运用支持向量机分类算法搭建一个金融反欺诈模型。
2.数据集
使用的数据集共有1000条客户信用卡的交易数据。其中,有400个欺诈样本,600个非欺诈样本。数据集中变量的详细描述如下表所示,表格中的“欺诈标签”列为目标变量,若是盗刷信用卡产生的交易则标记为1,代表欺诈,正常交易则标记为0。剩下的字段为特征变量,只选取了5个特征变量,在实际中使用的特征变量远很多,根据这些数据搭建支持向量机模型。
3、分析过程
(1)数据读取
首先通过pandas库读取数据,代码如下:
import pandas as pd
df = pd.read_excel('信用卡交易数据.xlsx')
df.head()
通过打印df.head()查看表格的前5行,结果如下所示:
其中第1列“欺诈标签”为目标变量y,其余5列为特征变量X,接下来我们将利用这些数据搭建金融反诈识别模型。
(2)提取特征变量和目标变量
首先将特征变量和目标变量分别提取出来,代码如下:
X = df.drop(columns='欺诈标签')
y = df['欺诈标签']
(3)划分训练集和测试集
提取完特征变量和目标变量后,将数据划分为训练集和测试集,代码如下:
# 从 sklearn 的 model_selection 模块中导入 train_test_split 函数,用于将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
# 将数据集划分为训练集和测试集
# X_train 存储训练集的特征变量,X_test 存储测试集的特征变量
# y_train 存储训练集的目标变量,y_test 存储测试集的目标变量
# X 和 y 是之前代码中提取的特征变量和目标变量
# test_size=0.2 表示将 20% 的数据划分为测试集,80% 的数据划分为训练集
# stratify=y 确保划分后的训练集和测试集在目标变量 y 的不同类别上的比例与原始数据中的比例相同
# random_state=123 确保划分结果的可重复性
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y,random_state=123)
①test_size=0.2表示我们希望将数据集的20%作为测试集,相应地,80% 的数据将作为训练集。
②stratify=y是一个重要的参数,当y是分类变量时,使用该参数可以确保划分后的训练集和测试集在不同类别上的比例与原始数据集的比例保持一致,这对于分类任务非常重要,避免某些类别在测试集中的比例失衡。
③random_state=123是一个随机数种子,它确保每次运行代码时,划分的结果是一致的。如果不设置这个参数,每次运行代码得到的训练集和测试集可能会有所不同,因为划分过程中涉及随机采样。设置该参数可以使结果可重复,方便代码的调试和结果的比较。
(4)模型构建
划分好训练集和测试集之后,导入sklearn中的SVM工具包,核函数采用线性核函数进行模型训练,代码如下:
# 从 sklearn 的 svm 模块中导入 SVC 类,SVC 是支持向量机分类器
from sklearn.svm import SVC
# 创建一个 SVC 模型的实例,使用线性核函数
# kernel='linear' 表示使用线性核函数,适用于线性可分的数据集
svm_model = SVC(kernel='linear')
# 使用训练集的特征变量 X_train 和目标变量 y_train 对 SVC 模型进行训练
svm_model.fit(X_train, y_train)
①from sklearn.svm import SVC:从scikit-learn的svm(支持向量机)模块中导入 SVC 类。SVC 是 Support Vector Classifier 的缩写,是支持向量机分类器,它可以用于分类任务。
②fit方法是scikit-learn中模型的核心训练方法,它将学习如何根据输入的训练数据来预测目标变量。对于SVC模型,它会找到最优的超平面(在使用线性核函数的情况下)或在高维空间中找到最优的决策边界,以将不同类别的数据分开。
(5)模型评估与预测
想要查看测试集的预测准确度,可以使用accuracy_score()函数,如下代码:
# 使用训练好的 svm_model 对测试集的特征变量 X_test 进行预测,得到预测结果 y_pred
y_pred = svm_model.predict(X_test)
# 从 sklearn 的 metrics 模块中导入 accuracy_score 函数,用于计算预测的准确率
from sklearn.metrics import accuracy_score
# 使用 accuracy_score 函数计算预测结果 y_pred 和真实结果 y_test 的准确率
score = accuracy_score(y_pred, y_test)
# 打印出准确率的得分
print(score)
将score打印输出,结果为0.785,也就是说,模型对整个测试集的预测准确度为78.5%。 对于分类模型,需要关注查准率和查全率,Python可以通过如下代码计算每一个类别的查准率和查全率:
# 使用 svm_model 的 score 方法计算在测试集上的准确率
svm_model.score(X_test, y_test)
# 从 sklearn 的 metrics 模块中导入 classification_report 函数,用于生成分类报告
from sklearn.metrics import classification_report
# 使用 classification_report 函数对测试集的真实结果 y_test 和预测结果 y_pred 生成分类报告并打印
print(classification_report(y_test, y_pred))
可见对于判断是否欺诈,模型的 precision(查准率)为0.82,查准率比较高,但是recall(查全率)为0.59,命中率不够高,表示有一些实际是欺诈的客户模型没能识别出来,遗漏了。因此,可以再调节模型的参数,以获得更优的预测效果。