使用Python机器学习进行在线支付欺诈检测

2025年1月5日 | 阅读 7 分钟

随着我们越来越接近现代,在线支付变得越来越受欢迎。在线支付对客户来说尤其有利,因为它消除了免费支付的问题并节省了时间。此外,我们不需要携带现金。然而,我们都知道好事可能伴随着不好的事情。

任何支付软件都可能被用来进行欺诈,因此在线支付方式存在危险。因此,在线支付欺诈检测至关重要。

使用 Python 机器学习进行在线支付欺诈检测

在这里,我们将使用 Python 机器学习来解决这个问题。

我们将使用的数据集中包含以下列

序号。特性描述
1step描述了时间单位。
2type进行的交易类型
3金额交易的总金额
4nameOrg交易产生的账户
5oldbalanceOrg交易前的发件人账户余额
6newbalanceOrg交易后的发件人账户余额
7nameDest收款的账户
8oldbalanceDest交易前的收款人账户余额
9newbalanceDest交易后的收款人账户余额
10isFraud预测值,为 0 或 1。

导入数据集和库

使用了以下库

  • Pandas:该库提供了多种方法来同时完成分析任务,并有助于将数据帧加载为二维数组格式。
  • Matplotlib/Seaborn:用于数据可视化。
  • Numpy:使用 Numpy 数组可以快速高效地完成大型计算。

说明

为了开发欺诈检测模型,此 Python 代码片段导入了数据分析和机器学习所需的库,设置了可视化环境,并导入了 XGBClassifier、LogisticRegression、RandomForestClassifier 和 SVC 等特定分类器。通过利用 XGBoost 方法和其他分类器,代码将数据分为训练集和测试集,训练模型,并使用 ROC-AUC、混淆矩阵、召回率和 F1 分数等指标评估结果。它还包含 %matplotlib inline 魔术命令用于 Jupyter notebook 中的内联绘图,以及 resample 工具来处理不平衡数据集。

数据集中包含付款类型、旧余额、支付金额、目的地名称等特征。

说明

使用 pd.read_csv 方法,代码尝试将 CSV 文件读入 Pandas DataFrame。但是,文件路径存在错误。正确的写法应该是 pd.read_csv('file_path')。然后使用 data.head() 显示 DataFrame 的前几行,让用户预览已加载的数据。为了使代码正常运行,必须将 'file_path' 更改为您的 CSV 文件的实际路径。

输出

Online Payment Fraud Detection Using Machine Learning in Python

为了检查有关数据的信息,我们将使用 info() 方法,如下所示

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6362620 entries, 0 to 6362619
Data columns (total 11 columns):
 #   Column          Dtype  
---  ------          -----  
 0   step            int64  
 1   type            object 
 2   amount          float64
 3   nameOrig        object 
 4   oldbalanceOrg   float64
 5   newbalanceOrig  float64
 6   nameDest        object 
 7   oldbalanceDest  float64
 8   newbalanceDest  float64
 9   isFraud         int64  
 10  isFlaggedFraud  int64  
dtypes: float64(5), int64(3), object(3)

让我们检查数据的平均值、计数、最小值和最大值。

输出

Online Payment Fraud Detection Using Machine Learning in Python

数据可视化

在本节中,我们将尝试理解和比较每一列。

让我们计算包含不同数据类型(如浮点数、整数和类别)的列数。

说明

在第一部分,通过使用 data.dtypes 确定数据类型是否为“object”来识别分类变量。对于对象数据类型,它会生成一个名为 obj 的布尔序列,其中 True 表示满足条件,然后检索条件为 True 的索引(列名)。然后输出此列表的长度以及类别变量的数量。

类似地,在第二部分识别整数变量。对于整数数据类型,它会生成布尔序列 int_,提取索引,并输出整数变量的数量。

在第三部分使用类似的方法识别浮点变量,并打印计数。

输出

Categorical variables: 3
Integer variables: 2
Float variables: 5

使用 Seaborn 库,让我们检查付款类型列的计数图。

说明

  • SNS:这是 Seaborn 库的别名,它是一个流行的数据统计可视化工具。

Seaborn 的 countplot 函数专门用于计算分类数据中每个类别的实例数。它显示表示每个类别观测数量的条形图。

  • x='type':这表示 x 轴将使用类别变量 'type' 进行绘制。它建议 'type' 变量应该计算每个类别的实例数。
  • data=data:此选项指定了从中获取计数图数据的 DataFrame(data)。

输出

Online Payment Fraud Detection Using Machine Learning in Python

条形图也可用于同时分析类型和数量列。

说明

  • sns:Seaborn 库使用此作为别名。
  • Barplot:此 Seaborn 函数使用条形图说明数值变量和类别变量之间的关系。
  • x='type':这表示 x 轴将使用类别变量 'type' 进行绘制。
  • y='amount' 指定 y 轴上条形的高度以反映数值变量 'amount'。
  • data=data:此选项指定了从中获取条形图数据的 DataFrame。

输出

Online Payment Fraud Detection Using Machine Learning in Python

让我们检查两个预测值之间的数据分布。

说明

代码将 value_counts() 函数应用于 DataFrame 'data' 的 'isFraud' 列。当使用此技术处理类别列时,会返回一个包含唯一值计数的 Series。这里,使用 'isFraud' 列(最有可能包含二元值,例如 0 表示非欺诈,1 表示欺诈)来计算每个唯一值的实例数。

输出将显示 'isFraud' 列中每个唯一值的出现次数。这些数据提供了对类别平衡的见解,并可用于分析数据集中欺诈和非欺诈案件的分布情况。

输出

isFraud
0    6354407
1       8213

数据集已经有相同的数量。因此,不需要抽样。

现在让我们使用 Distplot 查看 step 列的分布。

说明

plt.figure(figsize=(15, 6)) 用于设置要创建的图形的大小:宽度为 15 个单位,高度为 6 个单位。

使用函数 sns.distplot(data['step'], bins=50) 绘制 step 列的分布图。bins=50 参数指定直方图中 bin 或间隔的数量。图结合了数据的核密度估计和直方图表示。

输出

Online Payment Fraud Detection Using Machine Learning in Python

现在让我们使用热力图来确定各种特征之间的关联。

输出

Online Payment Fraud Detection Using Machine Learning in Python

数据预处理

此步骤包含以下内容

  • 类型列编码
  • 删除不必要的列,例如 nameOrig 和 nameDest
  • 数据分割

说明

pd.get_dummies(data['type'], drop_first=True) 函数通过将分类值转换为 'type' 列的二进制列来生成虚拟变量。为了防止多重共线性,当使用 drop_first=True 时,会删除第一个级别。

pd.concat([data, type_new], axis=1):将新创建的虚拟变量列 ('type_new') 沿列(axis=1)与原始 DataFrame 'data' 连接起来。

输出

Online Payment Fraud Detection Using Machine Learning in Python

编码完成后,我们现在可以删除不必要的列。使用下面的代码来完成。

让我们检查提取数据的形状。

说明

pd.get_dummies(data['type'], drop_first=True) 函数通过将分类值转换为 'type' 列的二进制列来生成虚拟变量。为了防止多重共线性,当使用 drop_first=True 时,会删除第一个级别。

pd.concat([data, type_new], axis=1):将新创建的虚拟变量列 ('type_new') 沿列(axis=1)与原始 DataFrame 'data' 连接起来。

输出

((6362620, 10), (6362620,))

现在让我们将数据分为两类:测试和训练。

模型训练

由于预测涉及分类,因此将应用以下模型

  • 逻辑回归:逻辑回归预测给定数据集属于特定类别或不属于特定类别的可能性。
  • XGBClassifier:这是梯度提升决策树的缩写。该方法顺序创建决策树,为每个独立变量分配权重,然后将其馈送到决策树以进行预测。
  • SVC:在 N 维空间中,SVC 用于定位一个清晰地对数据点进行分类的超平面。然后根据最接近它的元素显示输出。

RandomForestClassifier:随机森林分类器使用随机选择的训练数据部分来生成一系列决策树。之后,它会汇总多个决策树的投票来确定结果。

输出

LogisticRegression() : 
Training Accuracy:  0.8873981954950323
Validation Accuracy:  0.8849953734622176
XGBClassifier(base_score=None, booster=None, callbacks=None,
              colsample_bylevel=None, colsample_bynode=None,
              colsample_bytree=None, early_stopping_rounds=None,
              enable_categorical=False, eval_metric=None, feature_types=None,
              gamma=None, gpu_id=None, grow_policy=None, importance_type=None,
              interaction_constraints=None, learning_rate=None, max_bin=None,
              max_cat_threshold=None, max_cat_to_onehot=None,
              max_delta_step=None, max_depth=None, max_leaves=None,
              min_child_weight=None, missing=nan, monotone_constraints=None,
              n_estimators=100, n_jobs=None, num_parallel_tree=None,
              predictor=None, random_state=None, ...) : 
Training Accuracy:  0.9999817672497334
Validation Accuracy:  0.9994777637994892
RandomForestClassifier(criterion='entropy', n_estimators=7, random_state=7) : 
Training Accuracy:  0.9999992716004644
Validation Accuracy:  0.9650098729693373

模型评估

XGBClassifier 是表现最好的模型。为此,让我们绘制混淆矩阵。

输出

Online Payment Fraud Detection Using Machine Learning in Python