信用卡欺诈检测:当 Accuracy 99.6% 成为陷阱
属性内容标题信用卡欺诈检测当 Accuracy 99.6% 成为陷阱链接credit-card-fraud-detection-imbalanced-pr-auc摘要使用 Credit Card Fraud Detection 数据集在欺诈率仅 0.17% 的极端不平衡场景下训练 RandomForest强调 Precision-Recall AUC 与 Recall 比 Accuracy 更能反映真实业务价值。描述本文基于 284,807 笔信用卡交易数据展示极端不平衡二分类的完整流程分层划分、训练集下采样、RandomForest 建模、PR AUC 与 ROC AUC 评估、排列重要性分析最终 Recall 0.898PR AUC 0.719。本项目由 星枢 支持星枢官网https://claudeaihub.cloud/信用卡欺诈检测当 Accuracy 99.6% 成为陷阱做分类项目时Accuracy 是最容易让人误判的指标。当正样本只占 0.17% 时一个全部预测为正常的模型也能拿到 99.8% 的 Accuracy但它毫无意义。这次用信用卡欺诈检测数据集专门聊聊不平衡二分类里应该看什么指标。项目已开源https://github.com/coderWang404/xingshuProjects/tree/main/2026-06-16-credit-card-fraud-detection核心结论数据规模284,807 笔交易欺诈率0.17%492 笔欺诈特征V1-V28PCA 主成分 Time Amount模型RandomForestClassifier训练策略训练集下采样到欺诈:正常 1:10测试集保持原始分布Accuracy0.9960仅供参考不建议作为优化目标Recall0.8980Precision0.2876ROC AUC0.9766PR AUC0.7189Top featureV121. 数据集数据来自 Kaggle / TensorFlow data mirror 的 Credit Card Fraud Detection 数据集。字段说明字段含义V1-V28经 PCA 转换后的数值特征保护用户隐私Time距离首笔交易的秒数Amount交易金额Class0 正常1 欺诈类别分布类别数量占比正常284,31599.83%欺诈4920.17%欺诈样本极其稀少是典型的高度不平衡二分类问题。2. 环境准备pandas numpy scikit-learn matplotlib seaborn requestsgitclone https://github.com/coderWang404/xingshuProjects.gitcdxingshuProjects/2026-06-16-credit-card-fraud-detection python-mvenv venvsourcevenv/bin/activate pipinstall-rrequirements.txt3. 运行实验python experiments/credit-card-fraud/run_experiment.py脚本会自动从 TensorFlow data mirror 下载creditcard.csv如果已存在则跳过下载。4. 为什么测试集必须保持原始分布处理类别不平衡时常见的做法是对训练集进行重采样过采样、下采样、SMOTE 等。但测试集一定要保持原始分布否则你看到的指标并不能代表模型上线后的真实表现。本实验的做法用train_test_split(..., stratifyy)做分层 80/20 划分保证训练集和测试集的欺诈率都是 0.17% 左右。只在训练集下采样从正常类中随机抽取欺诈样本数量 10 倍的样本使训练集 fraud:normal ≈ 1:10。测试集不下采样、不过采样直接评估。这样训练出来的模型虽然 Precision 不高但 Recall 接近 0.9能找出绝大部分欺诈交易。5. 建模与结果模型参数RandomForestClassifier(n_estimators200,max_depth12,min_samples_leaf3,class_weightbalanced,random_state42,n_jobs-1,)测试集结果指标数值Accuracy0.9960Precision0.2876Recall0.8980F10.4356ROC AUC0.9766PR AUC0.71896. 指标解读Accuracy 不可信从混淆矩阵能看出正常类 56,864 笔几乎全部预测正确。欺诈类 98 笔预测对了 88 笔漏掉 10 笔。Accuracy 被正常类淹没了所以高达 99.6%。但在欺诈检测业务里我们更关心的是漏掉多少欺诈False Negative以及误杀多少正常交易False Positive。Recall 0.898每 100 笔欺诈能抓住约 90 笔漏掉约 10 笔。Precision 0.288每 100 笔被模型标记为欺诈的交易中只有约 29 笔真的是欺诈其余 71 笔是误报。Precision 低、Recall 高是欺诈检测常见的取舍。因为漏掉一笔欺诈的代价通常远高于人工复核一笔误报。7. 特征重要性使用排列重要性Permutation Importance评估特征排名特征重要性1V120.000452V170.000273V160.000214V100.000205V110.000156V140.000137Amount0.00007需要注意的是V1-V28 是 PCA 主成分无法直接映射到原始业务变量因此不能说出交易金额越大越像欺诈这类具体结论。只能说在这组 PCA 特征中V12 对模型决策的影响最大。Amount 虽然排名第七但重要性远低于 V12。8. 实验输出运行脚本后experiments/credit-card-fraud/outputs/会生成metrics.json # 完整指标 JSON classification_report.txt # 分类报告 dataset_profile.csv # 数据统计 feature_importance.csv # 排列重要性 class_distribution.png # 类别分布图 confusion_matrix.png # 混淆矩阵图 roc_curve.png # ROC 曲线 pr_curve.png # PR 曲线 feature_importance.png # 特征重要性图 summary.md # 实验摘要9. 总结这个实验的核心不是把 Accuracy 刷到多高而是展示如何在极端不平衡场景下正确评估模型Accuracy 在类别极度不平衡时会失效必须配合 Precision、Recall、F1、ROC AUC、PR AUC 一起分析。PR AUC 比 ROC AUC 更适合极度不平衡数据因为它更关注正类的排序质量。本实验中 ROC AUC 0.977 看起来很理想但 PR AUC 0.719 更真实地反映了区分欺诈的难度。训练集可以重采样测试集必须保持真实分布否则指标会自欺欺人。业务目标决定阈值选择。欺诈检测通常优先 Recall Precision 低一点可以接受。PCA 特征提升了可训练性但牺牲了可解释性。如果需要向业务部门解释模型应保留原始特征或做后续归因分析。如果想继续优化可以试试使用 SMOTE / ADASYN 进行过采样尝试 XGBoost / LightGBM 等梯度提升树调整分类阈值找到 Precision-Recall 的最佳平衡点加入代价敏感学习给 False Negative 设置更高代价使用异常检测思路如 Isolation Forest、Autoencoder作为补充本项目由 星枢 支持星枢官网https://claudeaihub.cloud/