引言:为什么需要信用卡欺诈检测?
根据尼尔森报告,全球每年因信用卡欺诈造成的损失超过250亿美元,金融机构需要在0.1秒内完成交易风险评估。本文将带您从零构建基于机器学习的信用卡欺诈检测系统,完整代码+可视化分析,让您掌握处理不平衡数据、模型调参和评估的核心技能。
一、项目准备:工具与数据
(一)技术栈清单
- Python 3.8+
- 核心库:pandas, numpy, matplotlib, seaborn
- 机器学习:scikit-learn, imbalanced-learn, xgboost
- 评估指标:sklearn.metrics, classification_report
(二)数据集说明
使用Kaggle公开的信用卡交易数据集,包含284,807笔交易记录,其中欺诈交易仅占0.172%(典型的不平衡数据)。数据特征已做PCA处理,包含28个匿名特征+交易金额+交易时间。
二、数据探索:理解欺诈模式
- import pandas as pd
- import matplotlib.pyplot as plt
-
- # 加载数据
- df = pd.read_csv('creditcard.csv')
-
- # 查看类别分布
- print(df['Class'].value_counts())
- # 输出:0 284315
- # 1 492
-
- # 可视化类别分布
- plt.figure(figsize=(6,4))
- df['Class'].value_counts().plot.bar()
- plt.title('Transaction Class Distribution')
- plt.xlabel('Class (0: Normal, 1: Fraud)')
- plt.ylabel('Count')
- plt.show()
复制代码 关键观察:
- 欺诈交易占比仅0.17%,属于严重不平衡数据;
- 需要特殊处理技术避免模型偏向多数类;
- 交易金额(Amount)特征需要标准化处理。
三、数据预处理:构建平衡训练集
(一)步骤1:标准化交易金额
- from sklearn.preprocessing import StandardScaler
-
- # 单独标准化金额特征
- scaler = StandardScaler()
- df['Amount'] = scaler.fit_transform(df['Amount'].values.reshape(-1,1))
复制代码 (二)步骤2:处理时间特征
- # 提取小时特征(欺诈交易常发生在特定时段)
- df['Hour'] = df['Time'].apply(lambda x: x//3600 % 24)
复制代码 (三)步骤3:采样技术对比
采样方法优点缺点简单过采样实现简单易过拟合SMOTE生成合成样本计算复杂聚类采样保持数据分布需要选择合适的聚类数欠采样减少计算量可能丢失重要信息选择方案:采用SMOTE过采样+随机欠采样组合。- from imblearn.over_sampling import SMOTE
- from imblearn.under_sampling import RandomUnderSampler
-
- # 初始化采样器
- smote = SMOTE(sampling_strategy=0.5, random_state=42)
- under_sampler = RandomUnderSampler(sampling_strategy=0.5, random_state=42)
-
- # 分割数据集
- X = df.drop(['Class', 'Time'], axis=1)
- y = df['Class']
-
- # 组合采样
- X_resampled, y_resampled = smote.fit_resample(X, y)
- X_resampled, y_resampled = under_sampler.fit_resample(X_resampled, y_resampled)
复制代码 四、特征工程:构建有效特征
特征选择方法
- 方差分析:移除方差0.1的特征;
- 递归特征消除:使用模型进行特征排序。
- from sklearn.feature_selection import VarianceThreshold, SelectKBest, f_classif
-
- # 方差过滤
- var_threshold = VarianceThreshold(threshold=0.8)
- X_var = var_threshold.fit_transform(X_resampled)
-
- # 相关性选择
- selector = SelectKBest(score_func=f_classif, k=15)
- X_selected = selector.fit_transform(X_var, y_resampled)
复制代码 五、模型构建:随机森林基线模型
(一)模型训练
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.model_selection import train_test_split
-
- # 分割训练测试集
- X_train, X_test, y_train, y_test = train_test_split(
- X_selected, y_resampled, test_size=0.2, stratify=y_resampled, random_state=42)
-
- # 初始化模型
- rf = RandomForestClassifier(
- n_estimators=100,
- max_depth=8,
- class_weight='balanced',
- random_state=42
- )
-
- # 训练模型
- rf.fit(X_train, y_train)
复制代码 (二)模型评估
- from sklearn.metrics import classification_report, roc_auc_score, roc_curve
-
- # 预测概率
- y_pred_proba = rf.predict_proba(X_test)[:,1]
-
- # 计算AUC
- auc = roc_auc_score(y_test, y_pred_proba)
- print(f'Baseline AUC: {auc:.4f}')
-
- # 绘制ROC曲线
- fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
- plt.plot(fpr, tpr, label=f'RF (AUC = {auc:.2f})')
- plt.plot([0,1], [0,1], 'k--')
- plt.xlabel('False Positive Rate')
- plt.ylabel('True Positive Rate')
- plt.title('ROC Curve Comparison')
- plt.leend()
- plt.show()
复制代码 六、模型优化:XGBoost调参实战
(一)参数网格设计
- param_grid = {
- 'n_estimators': [50, 100, 200],
- 'max_depth': [3, 5, 7],
- 'learning_rate': [0.01, 0.1, 0.2],
- 'subsample': [0.8, 1.0],
- 'colsample_bytree': [0.8, 1.0],
- 'scale_pos_weight': [1, 5, 10]
- }
复制代码 (二)网格搜索+交叉验证
- from sklearn.model_selection import GridSearchCV
-
- xgb = XGBClassifier(use_label_encoder=False, eval_metric='auc')
- grid = GridSearchCV(xgb, param_grid, cv=5, scoring='roc_auc', n_jobs=-1)
- grid.fit(X_train, y_train)
-
- # 最佳参数
- print(f'Best Parameters: {grid.best_params_}')
-
- # 最佳模型评估
- best_xgb = grid.best_estimator_
- y_pred_proba = best_xgb.predict_proba(X_test)[:,1]
- auc = roc_auc_score(y_test, y_pred_proba)
- print(f'Optimized AUC: {auc:.4f}')
复制代码 七、过拟合控制:关键技巧
- 早停机制:设置early_stopping_rounds ;
- 正则化:调整lambda和alpha参数;
- 特征选择:使用模型特征重要性排序;
- 交叉验证:增加验证集比例。
八、模型部署:生产环境优化
(一)性能优化技巧
- 模型压缩:使用ONNX Runtime加速推理;
- 批量预测:设置batch_size参数;
- 缓存机制:对重复特征进行缓存;
- 监控体系:建立模型漂移检测机制。
(二)代码示例(使用ONNX加速)
- import onnxruntime as rt
-
- # 转换模型
- onnx_model = convert_model(best_xgb, 'xgboost', ['input'], ['output_probability'])
-
- # 创建会话
- sess = rt.InferenceSession(onnx_model.SerializeToString())
-
- # 加速预测
- def onnx_predict(data):
- input_name = sess.get_inputs()[0].name
- pred_onx = sess.run(None, {input_name: data.values})[0]
- return pred_onx[:,1]
复制代码 九、评估指标深度解析
指标计算公式欺诈检测意义准确率(TP+TN)/(TP+TN+FP+FN)整体预测正确率召回率TP/(TP+FN)识别欺诈交易的能力精确率TP/(TP+FP)预测为欺诈交易的可信度F1 Score2(精确率召回率)/(精确率+召回率)平衡精确率和召回率的调和平均AUC-ROC曲线下面积分类器整体性能业务建议:在金融场景中,召回率应优先于精确率,确保尽可能捕捉欺诈交易。
十、结语:持续优化的重要性
欺诈模式不断演化,建议:
- 每月重新训练模型;
- 监控特征重要性变化;
- 结合规则引擎进行混合决策;
- 探索深度学习模型(如Autoencoder)。
通过本文实践,您已掌握处理不平衡数据、构建欺诈检测模型的核心技能。立即动手实践,构建属于您的智能风控系统吧!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |