news 2026/7/6 12:30:22

DBSCAN 聚类实战:信用卡欺诈检测中识别 5 个异常用户(附 Python 代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DBSCAN 聚类实战:信用卡欺诈检测中识别 5 个异常用户(附 Python 代码)

DBSCAN 聚类实战:信用卡欺诈检测中识别 5 个异常用户(附 Python 代码)

在金融风控领域,信用卡欺诈检测一直是数据科学家面临的重要挑战。传统的规则引擎和简单阈值方法往往难以应对日益复杂的欺诈手段,而基于密度的DBSCAN算法因其出色的噪声识别能力,成为处理这类问题的利器。本文将带您从零开始,通过一个真实的信用卡交易数据集,完整实现基于DBSCAN的异常检测流程。

1. 环境准备与数据探索

首先确保您的Python环境已安装以下核心库:

pip install pandas scikit-learn matplotlib seaborn

我们使用一个模拟的信用卡交易数据集,包含105位用户的消费行为特征。每个用户记录了两个关键维度:单笔交易平均金额和交易频率。数据中已知存在5个异常用户。

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 加载数据集 data = pd.read_csv('credit_card_behavior.csv') print(f"数据集维度: {data.shape}") print(data.head()) # 可视化数据分布 plt.figure(figsize=(10,6)) sns.scatterplot(x='avg_amount', y='frequency', data=data) plt.title('信用卡用户行为分布') plt.xlabel('单笔交易平均金额') plt.ylabel('交易频率') plt.grid(True) plt.show()

执行上述代码后,您将看到类似下图的分布情况:

用户ID平均金额交易频率
1001120.5015
100285.3022
.........

注意:在实际项目中,建议先进行数据标准化(如Z-score标准化),因为DBSCAN对特征的量纲敏感。本文为简化流程,直接使用原始数据。

2. DBSCAN核心参数解析

DBSCAN有两个关键参数需要特别关注:

  1. eps (ε):定义邻域半径

    • 值过小:会将正常点误判为噪声
    • 值过大:会合并本应分开的簇
  2. min_samples:核心点所需的最小邻域点数

    • 值过小:会产生过多小簇
    • 值过大:会将稀疏区域误判为噪声

通过K-距离图(K-Distance Graph)可以辅助确定eps值:

from sklearn.neighbors import NearestNeighbors neigh = NearestNeighbors(n_neighbors=5) nbrs = neigh.fit(data[['avg_amount', 'frequency']]) distances, indices = nbrs.kneighbors(data[['avg_amount', 'frequency']]) # 绘制K-距离图 distances = np.sort(distances[:,4], axis=0) plt.figure(figsize=(10,6)) plt.plot(distances) plt.xlabel('Points sorted by distance') plt.ylabel('5th nearest neighbor distance') plt.title('K-Distance Graph for eps estimation') plt.grid(True) plt.show()

观察图中"拐点"位置,通常选择距离开始快速上升的点作为eps值。在本案例中,我们初步设定eps=3.5,min_samples=5。

3. 实施DBSCAN聚类

使用scikit-learn实现DBSCAN聚类:

from sklearn.cluster import DBSCAN # 初始化并训练模型 dbscan = DBSCAN(eps=3.5, min_samples=5) clusters = dbscan.fit_predict(data[['avg_amount', 'frequency']]) # 将聚类结果添加到原始数据 data['cluster'] = clusters print("各簇统计信息:") print(data['cluster'].value_counts()) # 可视化聚类结果 plt.figure(figsize=(12,7)) sns.scatterplot(x='avg_amount', y='frequency', hue='cluster', palette='viridis', data=data) plt.title('DBSCAN聚类结果') plt.xlabel('单笔交易平均金额') plt.ylabel('交易频率') plt.grid(True) plt.show()

典型输出可能显示:

  • 簇0:95个用户(主要群体)
  • 簇1:3个用户(高频低额)
  • 簇2:2个用户(低频高额)
  • 噪声点(-1):5个用户

4. 异常检测与结果验证

在DBSCAN中,被标记为-1的点即为噪声点,也就是我们的潜在异常用户:

# 提取异常用户 anomalies = data[data['cluster'] == -1] print("检测到的异常用户:") print(anomalies) # 验证异常用户特征 normal_mean = data[data['cluster'] != -1][['avg_amount', 'frequency']].mean() anomaly_mean = anomalies[['avg_amount', 'frequency']].mean() comparison = pd.DataFrame({ '正常用户均值': normal_mean, '异常用户均值': anomaly_mean, '差异倍数': anomaly_mean/normal_mean }) print("\n特征对比:") print(comparison)

对比结果可能显示:

特征正常用户均值异常用户均值差异倍数
平均金额92.4320.83.47x
交易频率18.25.60.31x

这种"高金额低频次"的行为模式正是信用卡欺诈的典型特征。欺诈者往往会在短时间内进行大额消费,然后立即停止使用该卡。

5. 参数优化与模型对比

5.1 DBSCAN参数网格搜索

通过系统化的参数组合测试,寻找最优参数:

from sklearn.metrics import silhouette_score eps_range = np.linspace(2.0, 5.0, 10) min_samples_range = range(3, 10) results = [] for eps in eps_range: for min_samples in min_samples_range: dbscan = DBSCAN(eps=eps, min_samples=min_samples) labels = dbscan.fit_predict(data[['avg_amount', 'frequency']]) # 仅在有多个簇时计算轮廓系数 if len(set(labels)) > 1: score = silhouette_score(data[['avg_amount', 'frequency']], labels) n_clusters = len(set(labels)) - (1 if -1 in labels else 0) n_noise = list(labels).count(-1) else: score = -1 n_clusters = 0 n_noise = len(labels) results.append({ 'eps': eps, 'min_samples': min_samples, 'silhouette': score, 'n_clusters': n_clusters, 'n_noise': n_noise }) results_df = pd.DataFrame(results) best_params = results_df.loc[results_df['silhouette'].idxmax()] print("\n最优参数组合:") print(best_params)

5.2 与K-Means的性能对比

from sklearn.cluster import KMeans # K-Means聚类 kmeans = KMeans(n_clusters=3, random_state=42) data['kmeans_cluster'] = kmeans.fit_predict(data[['avg_amount', 'frequency']]) # 对比可视化 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18,6)) sns.scatterplot(x='avg_amount', y='frequency', hue='cluster', palette='viridis', data=data, ax=ax1) ax1.set_title('DBSCAN聚类结果') sns.scatterplot(x='avg_amount', y='frequency', hue='kmeans_cluster', palette='viridis', data=data, ax=ax2) ax2.set_title('K-Means聚类结果') plt.show() # 异常检测效果对比 kmeans_anomalies = data.groupby('kmeans_cluster').size().sort_values().head(1) print("\nK-Means检测到的潜在异常簇:", kmeans_anomalies.index[0], "包含", kmeans_anomalies.values[0], "个用户")

DBSCAN的优势在于:

  • 自动识别异常点(无需预先指定簇数量)
  • 能发现非球形簇
  • 对噪声鲁棒性强

6. 生产环境部署建议

在实际金融系统中,DBSCAN模型部署需要考虑以下关键点:

  1. 实时性处理

    # 增量式DBSCAN实现示例 from sklearn.base import BaseEstimator, ClusterMixin class IncrementalDBSCAN(BaseEstimator, ClusterMixin): def __init__(self, eps=0.5, min_samples=5): self.eps = eps self.min_samples = min_samples self.core_samples = [] self.labels_ = [] def partial_fit(self, X): # 实现增量聚类逻辑 pass
  2. 特征工程扩展

    • 添加时间维度特征(如夜间交易比例)
    • 引入地理位置特征(如跨国交易标记)
    • 计算行为偏离度指标
  3. 系统集成架构

    用户交易 → 特征计算引擎 → 实时风险评分 ↘ 批处理DBSCAN模型 → 风险预警系统

提示:在生产环境中,建议将DBSCAN与其他检测方法(如Isolation Forest、One-Class SVM)结合使用,构建多层次的防御体系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 12:30:20

Acellera-proteinprepare:蛋白质预处理工具详解与应用

1. 初识acellera-proteinprepare:蛋白质预处理的神器 在计算生物学和分子模拟领域,蛋白质结构的预处理是一个关键但常被忽视的环节。Acellera-proteinprepare作为Python生态中的专业工具包,专门用于自动化处理蛋白质结构文件,为后…

作者头像 李华
网站建设 2026/7/6 12:30:19

paperxie智能撰文|期刊论文高效创作指南,轻松拿捏各类投稿文稿

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/期刊论文期刊论文 - PaperXie智能写作PaperXieAi论文智能生成软件,10分钟生成万字毕业论文、期刊论文、文献综述、PPT,Aigc查重、降重报告、文献资料。只需一个标题,从开…

作者头像 李华
网站建设 2026/7/6 12:29:01

实战避坑:PyTorch模型转ONNX的常见错误与解决方案(附代码)

1. PyTorch模型转ONNX的核心原理与常见误区当你第一次尝试把PyTorch模型转换成ONNX格式时,可能会觉得这不过是一行torch.onnx.export()的事。但实际动手后就会发现,这里面的坑比想象中多得多。先说说ONNX的本质——它其实是个中间人,负责在不…

作者头像 李华
网站建设 2026/7/6 12:28:09

Keras 2.12 人脸识别实战:MegaFace 40人数据集,10层CNN模型验证集准确率98%

Keras 2.12 实战:构建10层CNN模型在MegaFace数据集实现98%验证准确率的人脸识别系统人脸识别技术正以惊人的速度渗透到安防、金融、智能终端等各个领域。作为计算机视觉的核心任务之一,如何构建高效准确的识别系统一直是开发者关注的焦点。本文将带您完整…

作者头像 李华
网站建设 2026/7/6 12:26:47

R3nzSkin国服特供版:英雄联盟终极免费换肤方案完全指南

R3nzSkin国服特供版:英雄联盟终极免费换肤方案完全指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 还在为心仪的英雄皮肤价格犹豫不决&…

作者头像 李华
网站建设 2026/7/6 12:23:59

【实战】VNC Server 6.7 在Windows Server上的部署与安全配置指南

1. VNC Server 6.7 基础认知与企业级需求分析第一次接触VNC Server是在2014年给某金融机构做远程运维方案时,当时就被它跨平台的像素级传输能力惊艳到了。不同于普通的远程桌面工具,VNC Server 6.7作为RealVNC推出的企业级解决方案,在Windows…

作者头像 李华