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(xavg_amount, yfrequency, datadata) plt.title(信用卡用户行为分布) plt.xlabel(单笔交易平均金额) plt.ylabel(交易频率) plt.grid(True) plt.show()执行上述代码后您将看到类似下图的分布情况用户ID平均金额交易频率1001120.5015100285.3022.........注意在实际项目中建议先进行数据标准化如Z-score标准化因为DBSCAN对特征的量纲敏感。本文为简化流程直接使用原始数据。2. DBSCAN核心参数解析DBSCAN有两个关键参数需要特别关注eps (ε)定义邻域半径值过小会将正常点误判为噪声值过大会合并本应分开的簇min_samples核心点所需的最小邻域点数值过小会产生过多小簇值过大会将稀疏区域误判为噪声通过K-距离图K-Distance Graph可以辅助确定eps值from sklearn.neighbors import NearestNeighbors neigh NearestNeighbors(n_neighbors5) nbrs neigh.fit(data[[avg_amount, frequency]]) distances, indices nbrs.kneighbors(data[[avg_amount, frequency]]) # 绘制K-距离图 distances np.sort(distances[:,4], axis0) 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值。在本案例中我们初步设定eps3.5min_samples5。3. 实施DBSCAN聚类使用scikit-learn实现DBSCAN聚类from sklearn.cluster import DBSCAN # 初始化并训练模型 dbscan DBSCAN(eps3.5, min_samples5) clusters dbscan.fit_predict(data[[avg_amount, frequency]]) # 将聚类结果添加到原始数据 data[cluster] clusters print(各簇统计信息:) print(data[cluster].value_counts()) # 可视化聚类结果 plt.figure(figsize(12,7)) sns.scatterplot(xavg_amount, yfrequency, huecluster, paletteviridis, datadata) plt.title(DBSCAN聚类结果) plt.xlabel(单笔交易平均金额) plt.ylabel(交易频率) plt.grid(True) plt.show()典型输出可能显示簇095个用户主要群体簇13个用户高频低额簇22个用户低频高额噪声点-15个用户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(epseps, min_samplesmin_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_clusters3, random_state42) data[kmeans_cluster] kmeans.fit_predict(data[[avg_amount, frequency]]) # 对比可视化 fig, (ax1, ax2) plt.subplots(1, 2, figsize(18,6)) sns.scatterplot(xavg_amount, yfrequency, huecluster, paletteviridis, datadata, axax1) ax1.set_title(DBSCAN聚类结果) sns.scatterplot(xavg_amount, yfrequency, huekmeans_cluster, paletteviridis, datadata, axax2) 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模型部署需要考虑以下关键点实时性处理# 增量式DBSCAN实现示例 from sklearn.base import BaseEstimator, ClusterMixin class IncrementalDBSCAN(BaseEstimator, ClusterMixin): def __init__(self, eps0.5, min_samples5): self.eps eps self.min_samples min_samples self.core_samples [] self.labels_ [] def partial_fit(self, X): # 实现增量聚类逻辑 pass特征工程扩展添加时间维度特征如夜间交易比例引入地理位置特征如跨国交易标记计算行为偏离度指标系统集成架构用户交易 → 特征计算引擎 → 实时风险评分 ↘ 批处理DBSCAN模型 → 风险预警系统提示在生产环境中建议将DBSCAN与其他检测方法如Isolation Forest、One-Class SVM结合使用构建多层次的防御体系。