使用Python机器学习进行在线支付欺诈检测2025年1月5日 | 阅读 7 分钟 随着我们越来越接近现代,在线支付变得越来越受欢迎。在线支付对客户来说尤其有利,因为它消除了免费支付的问题并节省了时间。此外,我们不需要携带现金。然而,我们都知道好事可能伴随着不好的事情。 任何支付软件都可能被用来进行欺诈,因此在线支付方式存在危险。因此,在线支付欺诈检测至关重要。 使用 Python 机器学习进行在线支付欺诈检测在这里,我们将使用 Python 机器学习来解决这个问题。 我们将使用的数据集中包含以下列
导入数据集和库使用了以下库
说明 为了开发欺诈检测模型,此 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 文件的实际路径。 输出 ![]() 为了检查有关数据的信息,我们将使用 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) 让我们检查数据的平均值、计数、最小值和最大值。 输出 ![]() 数据可视化在本节中,我们将尝试理解和比较每一列。 让我们计算包含不同数据类型(如浮点数、整数和类别)的列数。 说明 在第一部分,通过使用 data.dtypes 确定数据类型是否为“object”来识别分类变量。对于对象数据类型,它会生成一个名为 obj 的布尔序列,其中 True 表示满足条件,然后检索条件为 True 的索引(列名)。然后输出此列表的长度以及类别变量的数量。 类似地,在第二部分识别整数变量。对于整数数据类型,它会生成布尔序列 int_,提取索引,并输出整数变量的数量。 在第三部分使用类似的方法识别浮点变量,并打印计数。 输出 Categorical variables: 3 Integer variables: 2 Float variables: 5 使用 Seaborn 库,让我们检查付款类型列的计数图。 说明
Seaborn 的 countplot 函数专门用于计算分类数据中每个类别的实例数。它显示表示每个类别观测数量的条形图。
输出 ![]() 条形图也可用于同时分析类型和数量列。 说明
输出 ![]() 让我们检查两个预测值之间的数据分布。 说明 代码将 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 或间隔的数量。图结合了数据的核密度估计和直方图表示。 输出 ![]() 现在让我们使用热力图来确定各种特征之间的关联。 输出 ![]() 数据预处理此步骤包含以下内容
说明 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' 连接起来。 输出 ![]() 编码完成后,我们现在可以删除不必要的列。使用下面的代码来完成。 让我们检查提取数据的形状。 说明 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,)) 现在让我们将数据分为两类:测试和训练。 模型训练由于预测涉及分类,因此将应用以下模型
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 是表现最好的模型。为此,让我们绘制混淆矩阵。 输出 ![]() |
我们请求您订阅我们的新闻通讯以获取最新更新。