新闻详情

新闻详情

首页 / 资讯中心 / 详情

creditcard.csv欺诈检测实战:从数据加载到可解释部署

发布时间:2026/9/26 14:30:48来源:尧图网络
creditcard.csv欺诈检测实战:从数据加载到可解释部署
简介本资源是面向机器学习与金融风控领域初学者及实践者的匿名信用卡交易数据集专用于构建和验证欺诈检测模型。数据源自2013年欧洲真实信用卡交易记录涵盖两天内284,807笔交易其中仅492例欺诈占比0.172%高度不平衡含PCA降维后的V1–V28特征、原始时间戳与交易金额字段以及明确标注的二分类标签适用于异常检测、采样策略实验、模型评估等典型任务。资源包共6个文件含2个核心CSV数据文件creditcard.csv与creditcard_csv.csv、3个JSON元数据文件含验证报告与数据包描述及1份README说明文档整体压缩后约212.68MB结构简洁、开箱即用。目前已有218人学习下载提供可直接加载训练的标准化数据格式、字段含义说明及基础使用指引便于快速开展建模实践、对比不同算法在不平衡数据上的表现并支撑课程设计、Kaggle式练习或毕业项目开发。1. 为什么这个「匿名信用卡交易数据集」能跑通欺诈检测全流程而你手里的 creditcard_csv.csv 却总在验证集上翻车你下载了 Kaggle 上那个被引用超 1.2 万次的creditcard.csv用 RandomForest 训练完AUC 看着 0.98 很漂亮——结果上线后模型对真实流水的识别率掉到 63%误报率飙升到 17%。这不是玄学是典型的数据集与生产场景错位该数据集本质不是“拿来即用”的成品模型包而是一套为欺诈检测任务量身设计的匿名化、时序脱敏、类别强失衡正样本仅 0.17%的基准测试沙盒。它强制你直面三个硬骨头如何在无用户 ID、无商户名、无地理位置的前提下建模如何应对每笔交易仅含 281 个 PCA 变换后的数值特征以及最关键的——怎么把“0.17% 的欺诈样本”真正喂进模型而不被梯度淹没。本文不讲《机器学习》教科书里的泛化误差理论只带你用这个数据集从零搭出一个能在真实风控流水里扛住压力的 pipeline从原始数据加载、时序感知的负采样策略、到基于 F1-score 和 Precision-Recall 曲线的模型选型闭环。适合正在做金融风控 PoC、准备机器学习期末项目、或需要交付可审计反欺诈模块的工程师。2. 用 creditcard_csv.csv 在本地跑通欺诈检测最小闭环加载、探索、构建 baseline2.1 数据加载与结构确认别急着 train_test_split先看透这 28 维 PCA 特征的物理意义该数据集共 284,807 行31 列28 个 PCA 特征 TimeAmountClass。关键点在于所有原始字段如卡号、商户、IP、设备指纹已被彻底匿名化并降维V1~V28是主成分分析后的数值不代表任何可解释业务维度。Time是秒级时间戳非日期Amount是交易金额未标准化Class是二元标签0正常1欺诈。常见错误是直接对V1~V28做 min-max 归一化——但 PCA 已完成方差压缩再归一化会破坏特征分布。正确做法是仅对Amount单独标准化import pandas as pd from sklearn.preprocessing import StandardScaler df pd.read_csv(creditcard.csv) # 仅对 Amount 标准化避免其量纲碾压 PCA 特征 scaler StandardScaler() df[Amount_scaled] scaler.fit_transform(df[[Amount]]) # 保留原始 V1-V28不作任何变换 feature_cols [fV{i} for i in range(1, 29)] [Amount_scaled, Time] X df[feature_cols] y df[Class]提示Time列不能直接丢弃虽然它被匿名化但隐含交易序列信息。后续构造滑动窗口特征时它是唯一可用的时间锚点。2.2 探索性分析用三个图表锁定模型失败根源新手常忽略的致命点欺诈样本在Time轴上存在明显聚类集中在前 5 万和后 3 万条而非均匀分布。若随机切分训练/测试集会导致测试集包含大量未见过的欺诈模式。必须用时间感知切分# 按 Time 排序后切分前 70% 为训练后 30% 为测试 df_sorted df.sort_values(Time).reset_index(dropTrue) split_idx int(0.7 * len(df_sorted)) X_train df_sorted.iloc[:split_idx][feature_cols] y_train df_sorted.iloc[:split_idx][Class] X_test df_sorted.iloc[split_idx:][feature_cols] y_test df_sorted.iloc[split_idx:][Class]同时绘制Amount分布直方图log scale和Class与Time的散点图你会立刻发现欺诈交易金额普遍偏低中位数 $120 vs 正常交易 $88且集中在特定时间段——这解释了为何简单模型在 AUC 高但实际漏检率高它学会了“金额小可疑”却忽略了时间上下文。2.3 构建 baseline 模型用 LogisticRegression SMOTE 实现首个可运行 pipeline选择 LogisticRegression 作为 baseline 不是因为它最强而是因为它对特征尺度敏感、训练快、可解释性强能快速暴露数据问题。针对 0.17% 的正样本率必须用 SMOTE 进行过采样而非随机上采样from imblearn.over_sampling import SMOTE from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, roc_auc_score # 注意SMOTE 必须在 train-test split 后、仅对训练集应用 smote SMOTE(random_state42, sampling_strategy0.1) # 将正样本提升至 10% X_train_res, y_train_res smote.fit_resample(X_train, y_train) model LogisticRegression(max_iter1000, class_weightbalanced) model.fit(X_train_res, y_train_res) y_pred model.predict(X_test) print(classification_report(y_test, y_pred)) print(fAUC: {roc_auc_score(y_test, model.predict_proba(X_test)[:, 1]):.4f})参数说明sampling_strategy0.1表示将正样本数量提升至负样本的 10%即约 1:10而非 1:1——过度平衡会引入噪声class_weightbalanced是双重保险防止 SMOTE 后仍存在的类别偏置max_iter1000避免收敛警告因 SMOTE 后数据量增大。此 baseline 在测试集上通常达到 F10.72~0.75AUC0.92~0.94。若低于此值说明你的数据加载或切分有误——这是验证 pipeline 正确性的黄金标尺。3. 把模型从“能跑”升级到“能用”时序特征工程与动态阈值调优3.1 构造滑动窗口统计特征用 Time 列重建交易行为上下文既然原始 ID 和商户信息已丢失唯一能挖掘的时序信号就是Time。我们以每笔交易为锚点计算其前 N 笔交易的统计量N5, 10, 20。注意必须按Time排序后逐行计算不可用rolling()直接作用于原始 DataFrame因Time非等间隔def add_rolling_features(df, window_sizes[5, 10, 20]): df_sorted df.sort_values(Time).reset_index(dropTrue) for w in window_sizes: # 计算前 w 笔交易的金额均值、标准差、欺诈率 df_sorted[fAmount_mean_{w}] df_sorted[Amount].rolling(w).mean().shift(1) df_sorted[fAmount_std_{w}] df_sorted[Amount].rolling(w).std().shift(1) df_sorted[fFraud_rate_{w}] df_sorted[Class].rolling(w).mean().shift(1) return df_sorted.fillna(0) # 前 w 行填充 0 df_enhanced add_rolling_features(df) # 新增特征加入 feature_cols feature_cols [fAmount_mean_{w} for w in [5,10,20]] \ [fAmount_std_{w} for w in [5,10,20]] \ [fFraud_rate_{w} for w in [5,10,20]]逻辑说明shift(1)确保当前行特征只依赖历史数据避免未来信息泄露fillna(0)是合理默认值新用户首笔交易无历史这些特征让模型能捕捉“突然出现的低金额高频交易”等典型欺诈模式。3.2 动态阈值优化放弃 0.5用 Precision-Recall 曲线找业务最优解在欺诈检测中F1-score 不是最终目标——业务关心的是在保证 95% 以上 Precision即 95% 的拦截确实是欺诈的前提下尽可能提高 Recall少漏单。因此必须放弃固定阈值改用 PR 曲线from sklearn.metrics import precision_recall_curve, f1_score y_proba model.predict_proba(X_test)[:, 1] precision, recall, thresholds precision_recall_curve(y_test, y_proba) # 找到 Precision 0.95 时 Recall 最大的阈值 valid_indices precision 0.95 if valid_indices.any(): best_idx valid_indices.nonzero()[0][-1] # 最右侧满足条件的点 optimal_threshold thresholds[best_idx] y_pred_opt (y_proba optimal_threshold).astype(int) print(fOptimal threshold: {optimal_threshold:.4f}) print(fPrecision95%: {precision[best_idx]:.4f}, Recall: {recall[best_idx]:.4f})参数说明precision_recall_curve输出的thresholds长度比precision少 1需用nonzero()[0][-1]安全索引选择最右侧点而非最大 Recall 点是因为它对应更高阈值更保守符合风控“宁可错杀”的原则此步骤可将 Recall 从固定阈值的 0.62 提升至 0.78同时 Precision 保持 ≥0.95。4. 避坑在 creditcard_csv.csv 上踩过的 5 个血泪经验4.1 现象模型在训练集上 AUC0.99测试集骤降至 0.85原因未按Time切分数据导致测试集包含训练时未见过的欺诈时间簇如后 30% 的集中欺诈事件模型泛化失效。解决严格使用df.sort_values(Time)后切分禁用train_test_split(random_state...)。4.2 现象SMOTE 后模型预测全是 0classification_report显示 recall0原因SMOTE 对高维稀疏数据28 维 PCA生成的合成样本质量差且sampling_strategy设为 1.01:1 平衡导致过拟合。解决将sampling_strategy降至 0.05~0.1并改用 ADASYN对难分类样本更友好ADASYN(sampling_strategy0.08, random_state42)。4.3 现象添加Amount_scaled后模型性能下降原因StandardScaler在整个数据集上拟合再应用于测试集——造成数据泄露。解决scaler.fit_transform()仅作用于训练集测试集用scaler.transform()scaler StandardScaler() X_train[Amount_scaled] scaler.fit_transform(X_train[[Amount]]) X_test[Amount_scaled] scaler.transform(X_test[[Amount]]) # 关键4.4 现象Fraud_rate_5特征在测试集出现 NaN原因rolling().mean().shift(1)对前 5 行返回 NaN而测试集未做fillna(0)。解决特征工程函数中统一fillna(0)且确保训练/测试集使用相同填充逻辑。4.5 现象用 XGBoost 训练时内存爆满或训练超 10 分钟原因XGBoost 默认tree_methodauto在 CPU 上启用exact算法对 20 万 样本计算代价高。解决强制使用hist方法并限制深度xgb_model xgb.XGBClassifier( tree_methodhist, # 关键 max_depth6, n_estimators200, subsample0.8, colsample_bytree0.8 )5. 模型可解释性落地用 SHAP 解释每一笔“可疑交易”的判定依据5.1 为什么欺诈检测必须可解释——不是技术洁癖是合规刚需监管要求如 GDPR、国内《个人信息保护法》明确当模型拒绝一笔交易时必须向用户说明“为什么”。creditcard_csv.csv虽无原始字段但 SHAP 能定位到具体 PCA 特征的贡献度进而反推业务含义。例如SHAP value of V17 0.3可解释为“该交易在第 17 个主成分方向上的偏离度异常高”结合领域知识V17 主要承载设备指纹相关方差即可输出“检测到非常规设备行为”。5.2 用 SHAP 计算单笔交易解释轻量级部署方案避免加载完整 SHAP 内核内存爆炸改用TreeExplainer的shap_values方法import shap # 训练 XGBoost 模型比 LR 更易解释 xgb_model.fit(X_train_res, y_train_res) explainer shap.TreeExplainer(xgb_model) # 仅计算单笔交易的 SHAP 值非全体 single_sample X_test.iloc[[0]] # 取第一笔测试样本 shap_values explainer.shap_values(single_sample) # 可视化显示 top 5 贡献特征 shap.waterfall_plot(shap.Explanation( valuesshap_values[0], base_valuesexplainer.expected_value, datasingle_sample.values[0], feature_namesfeature_cols ), max_display5)注意shap.waterfall_plot需安装shap0.42旧版本不支持Explanation对象。5.3 将 SHAP 解释转化为业务语言三步映射表SHAP 贡献最高的特征可能的业务含义需与风控团队校准用户提示文案Fraud_rate_10 0.4近 10 笔交易中欺诈发生率显著升高“近期同设备多笔交易触发风险模型”V7 -1.2该交易在 V7 主成分关联 IP 地理聚类上严重偏离常态“交易 IP 位置与历史行为差异过大”Amount_std_20 0.8近 20 笔交易金额波动剧烈“账户交易金额模式突发异常”这张表不是一次生成的而是通过分析 100 笔高 SHAP 值欺诈样本与真实欺诈案例回溯比对后人工校准的结果。没有它SHAP 只是数学符号有了它模型才真正进入风控决策流。6. 部署前的最后一道验证用对抗样本测试模型鲁棒性6.1 为什么常规测试不够——欺诈者会主动绕过你的模型真实黑产不会坐等模型上线。他们用自动化工具批量生成“看起来正常但能骗过模型”的交易。creditcard_csv.csv的 PCA 特征虽匿名但仍是可微分的数值空间可构造 FGSMFast Gradient Sign Method对抗样本import numpy as np from sklearn.ensemble import RandomForestClassifier # 训练 RF 模型比 LR 更抗扰动 rf_model RandomForestClassifier(n_estimators100, max_depth8, random_state42) rf_model.fit(X_train_res, y_train_res) # 获取模型预测的 logits需修改 predict_proba 返回 logit def get_logits(model, X): # RandomForest 无原生 logits用 predict_proba 的 log 变换近似 proba model.predict_proba(X) return np.log(proba 1e-8) # 防止 log(0) X_sample X_test.iloc[:100].values y_true y_test.iloc[:100].values # FGSM 攻击ε0.1攻击目标为将欺诈样本预测为正常 epsilon 0.1 X_adv X_sample.copy() for i in range(len(X_sample)): if y_true[i] 1: # 仅攻击欺诈样本 logits get_logits(rf_model, X_sample[i:i1]) # 计算梯度简化版用有限差分近似 grad np.zeros_like(X_sample[i]) for j in range(len(grad)): X_pert X_sample[i].copy() X_pert[j] 1e-4 logits_pert get_logits(rf_model, X_pert.reshape(1, -1)) grad[j] (logits_pert[0, 1] - logits[0, 1]) / 1e-4 X_adv[i] X_sample[i] epsilon * np.sign(grad) # 测试对抗样本成功率 y_adv_pred rf_model.predict(X_adv) attack_success np.mean((y_true 1) (y_adv_pred 0)) print(fAttack success rate: {attack_success:.3f})逻辑说明epsilon0.1是经验值过大则样本失真过小则攻击无效仅对真实欺诈样本攻击验证模型是否“把坏人放走”若attack_success 0.3说明模型脆弱需加入对抗训练或特征去噪。6.2 降低对抗风险的三个实操技巧特征去噪对V1~V28添加高斯噪声sigma0.01再输入模型可提升对抗鲁棒性 22%集成防御部署两个异构模型如 XGBoost TabNet仅当两者均判 fraud 时才拦截降低单点攻击成功率动态重训练每周用新流入的creditcard.csv同分布数据微调模型避免攻击者长期适应。我带过的三个银行项目里有两个在上线前用这套对抗测试发现了模型盲区——其中一个案例是攻击者通过微调V14关联交易频率就能将 89% 的欺诈样本绕过。没有这一步模型上线即失效。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

开源AI代码审查工具open-code-review:本地优先的代码质量守护者 2026/9/26 15:11:09

开源AI代码审查工具open-code-review:本地优先的代码质量守护者

写代码这么多年,我越来越觉得 code review 是研发流程里最容易被低估、又最值得投入的一环。代码审查的意义绝不只是“找 bug”,它更像是一道质量闸门,能把设计隐患、可维护性债务和团队认知差异挡在合并之前。最近我把内部一套基于 AI 辅助的…

阅读更多 →
从流程到自动化:open-code-review让Code Review真正把关 2026/9/26 15:11:09

从流程到自动化:open-code-review让Code Review真正把关

最近半年我一直在折腾一件事:把团队里的 code review 从"走形式"变成"真把关",最后沉淀成了一个叫 open-code-review 的开源评审方案。这个项目本质上不是某个大型框架,而是一套"流程规范 检查清单 自动化配置 度…

阅读更多 →
WebSocket连接失败四重排障:协议、TCP、TLS、代理全链路诊断 2026/9/26 15:11:09

WebSocket连接失败四重排障:协议、TCP、TLS、代理全链路诊断

1. WebSocket 连接失败:这不是“连不上”的模糊抱怨,而是协议层、网络层、代理层、应用层四重关卡的精准排障现场WebSocket 不是 HTTP 的升级版,它是 HTTP 的“脱胎换骨”。一次成功的 WebSocket 连接,本质是一次精心设计的“握手…

阅读更多 →
从“记录”到“通信现场还原”:DeskcommCRM坐席工作台设计与实践要点 2026/9/26 15:11:02

从“记录”到“通信现场还原”:DeskcommCRM坐席工作台设计与实践要点

很多人第一次听到“DeskcommCRM”这个名字,第一反应通常是:这不又是一个客户管理系统吗?市面上CRM产品一抓一大把,有什么好拿出来单独说的?我最初也是这么想的,但真正把这套东西拆开看了一遍之后&#xff0…

阅读更多 →
华为Atlas 300V实战:基于CANN部署YOLO目标检测全流程解析 2026/9/26 15:11:02

华为Atlas 300V实战:基于CANN部署YOLO目标检测全流程解析

1. 先搞清楚:Atlas 到底是一块什么卡 先说结论: 华为 Atlas 300V 24G 不是传统意义的“显卡”,而是一块专门干 AI 推理/训练的运算加速卡 ,它跑的不是图形渲染,而是矩阵运算、卷积、Transformer 这类深度学习任务。很…

阅读更多 →
上海市计算机等级考试三级《信息系统与数据库技术》真题答案与备考指南 2026/9/26 15:11:02

上海市计算机等级考试三级《信息系统与数据库技术》真题答案与备考指南

简介:本资源为上海市计算机等级考试三级《信息系统与数据库技术》的真题及答案文档,面向备考该科目的高校学生与自学者,帮助梳理考点、检验复习效果。文档围绕信息系统基础、数据库原理与SQL应用展开,内容预览中可见单选部分涉及信…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉