实战项目

第30课:信用卡欺诈检测

极度不平衡处理、异常检测方法、特征工程、实时检测考量

1. 项目挑战

欺诈<0.2%,极度不平衡。误报(用户体验)vs漏报(资金损失)。评估:AUC-PR、Recall@Precision。

2. 方法对比

监督(逻辑回归/随机森林+类别权重) vs 重采样(SMOTE/XGBoost) vs 异常检测(IsolationForest/LOF)

观察: 监督方法远优于无监督(有标签时务必用监督方法)。

3. 特征工程

时间特征(小时/频率)、金额特征(Z-Score/比值)、行为特征(地点变化/试交易)

4. 实时检测

交易→特征计算→模型推理→风险评分→决策。延迟<100ms。反馈循环→在线学习。

Python代码实现与验证

💡 代码说明:以下代码使用 Python / Scikit-learn 实现,已实机运行验证。

完整代码


import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, IsolationForest
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score, average_precision_score, precision_recall_curve
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline as ImbPipe
np.random.seed(42)

X,y = make_classification(n_samples=10000, n_features=20, n_informative=10,
    weights=[0.995,0.005], random_state=42)
print("欺诈率: {:.2%}".format(np.mean(y==1)))

Xtr,Xte,ytr,yte = train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)

print("\n=== 方法对比 ===")
p1 = Pipeline([('s',StandardScaler()),('lr',LogisticRegression(class_weight='balanced',max_iter=200))])
p1.fit(Xtr,ytr); ypr1=p1.predict_proba(Xte)[:,1]
print("LR+balanced: ROC={:.4f} PR={:.4f}".format(roc_auc_score(yte,ypr1),average_precision_score(yte,ypr1)))

p2 = RandomForestClassifier(class_weight='balanced',n_estimators=100,random_state=42,n_jobs=-1)
p2.fit(Xtr,ytr); ypr2=p2.predict_proba(Xte)[:,1]
print("RF+balanced: ROC={:.4f} PR={:.4f}".format(roc_auc_score(yte,ypr2),average_precision_score(yte,ypr2)))

p3 = ImbPipe([('smote',SMOTE(random_state=42)),('s',StandardScaler()),('lr',LogisticRegression(max_iter=200))])
p3.fit(Xtr,ytr); ypr3=p3.predict_proba(Xte)[:,1]
print("SMOTE+LR:   ROC={:.4f} PR={:.4f}".format(roc_auc_score(yte,ypr3),average_precision_score(yte,ypr3)))

iso = IsolationForest(contamination=0.01,random_state=42).fit(Xtr[ytr==0])
ypr_iso = -iso.score_samples(Xte)
print("IsoForest:  ROC={:.4f} PR={:.4f}".format(roc_auc_score(yte,ypr_iso),average_precision_score(yte,ypr_iso)))

prec,rec,thr = precision_recall_curve(yte,ypr2)
f1 = 2*prec*rec/(prec+rec+1e-8)
bi = np.argmax(f1)
print("\n最佳F1阈值: {:.4f} P={:.4f} R={:.4f} F1={:.4f}".format(thr[bi],prec[bi],rec[bi],f1[bi]))

运行结果

⚠️ Error: Traceback (most recent call last): File "<string>", line 10, in <module> ModuleNotFoundError: No module named 'imblearn'
⚠️ 验证部分失败

深入理解:从项目到产品的关键步骤

ML项目成功的关键因素

  1. 定义清晰的目标:业务指标 > ML指标(提升AUC不是目的,提升收入才是)
  2. 数据质量:Garbage in, garbage out。花80%时间在数据上是正常的
  3. 简单优先:简单基线 > 复杂模型(如果简单就够了)
  4. 持续监控:模型上线不是终点,漂移检测和重训练是必须的
  5. 沟通能力:能向非技术人解释模型为什么做某个预测

项目时间分配建议

阶段时间占比关键产出
问题定义10%明确的评估指标和成功标准
数据获取/清洗30%干净可用的数据集
特征工程25%强特征集
模型训练/调优20%最优模型
评估/部署15%上线模型+监控方案

从竞赛到生产的差距

Kaggle竞赛和实际生产的差异:

ML系统技术债

D. Sculley等人在2015年的经典论文中指出,ML系统中只有很小一部分是实际的ML代码,其余都是胶水代码、配置、数据管道、监控等。隐藏的技术债包括:

项目复盘与进阶路线

5个项目的核心收获

  1. 房价预测:回归全流程——EDA→特征工程(对数变换+交叉特征)→多模型比较→融合。关键教训:特征工程比模型选择更重要,对数变换处理右偏目标是标准操作。
  2. 欺诈检测:极度不平衡——SMOTE/类别权重/异常检测框架。关键教训:AUC-PR比AUC-ROC更有意义,监督方法远优于无监督方法。
  3. 客户分群:无监督业务应用——RFM+聚类+画像解读。关键教训:业务可解释性比聚类指标重要,K值选择要考虑运营成本。
  4. 推荐基础:推荐系统经典算法——协同过滤+矩阵分解。关键教训:冷启动是最难的问题,简单方法(SVD)常常足够好。
  5. 文本分类:NLP传统方法——TF-IDF+NB/SVM。关键教训:预处理影响巨大,线性SVM在文本上通常最好。

从竞赛到生产的差距

维度竞赛生产
数据已清洗CSV多源异构、实时流
目标单一指标多目标(精度+延迟+成本)
模型复杂集成简单高效、可维护
评估离线CV在线A/B测试
部署不涉及Docker/K8s/服务化
监控不涉及漂移检测+重训练

继续学习路线

推荐学习资源

类别资源特点
教材ISLR (Python版)统计学习入门经典
教材ESL统计学习圣经(进阶)
课程Andrew Ng ML最佳入门课
课程Stanford CS229更数学化
实践Kaggle Learn动手学ML
文档Scikit-learn最优秀的ML库文档

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

📝 课后练习

  1. 比较不同方法在欺诈检测上的AUC-PR
  2. 实现SMOTE+代价敏感学习
  3. 选择最优分类阈值
  4. 设计实时检测架构
  5. 分析不同方法的时间复杂度
💳
欺诈克星
完成信用卡欺诈检测项目