【附Python源码】基于决策树的信用卡欺诈检测实战
【附Python源码】基于决策树的信用卡欺诈检测实战⚠️完整源码地址https://github.com/anjuxi/Decision_tree-credit_card_fraud_detection在金融科技领域欺诈检测始终是风控系统的核心模块之一。信用卡欺诈检测属于典型的二分类问题但其特殊性在于类别分布的严重失衡。本项目采用的数据集包含284,807条交易记录其中正常交易284,315条欺诈交易仅492条欺诈样本占比不足0.2%。数据集形状:(284807,31) 前5行数据:交易频率 V1 V2 V3 V4 V5 V6 V7 \00.0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.23959910.01.1918570.2661510.1664800.4481540.060018-0.082361-0.07880321.0-1.358354-1.3401631.7732090.379780-0.5031981.8004990.79146131.0-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.23760942.0-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941 V8 V9...V21 V22 V23 V24 V25 \00.0986980.363787...-0.0183070.277838-0.1104740.0669280.12853910.085102-0.255425...-0.225775-0.6386720.101288-0.3398460.16717020.247676-1.514654...0.2479980.7716790.909412-0.689281-0.32764230.377436-1.387024...-0.1083000.005274-0.190321-1.1755750.6473764-0.2705330.817739...-0.0094310.798278-0.1374580.141267-0.206010 V26 V27 V28 交易金额 类别标签0-0.1891150.133558-0.021053149.62010.125895-0.0089830.0147242.6902-0.139097-0.055353-0.059752378.6603-0.2219290.0627230.061458123.50040.5022920.2194220.21515369.990[5rows x31columns] 数据类型:交易频率 float64 V1 float64 V2 float64 V3 float64 V4 float64 V5 float64 V6 float64 V7 float64 V8 float64 V9 float64 V10 float64 V11 float64 V12 float64 V13 float64 V14 float64 V15 float64 V16 float64 V17 float64 V18 float64 V19 float64 V20 float64 V21 float64 V22 float64 V23 float64 V24 float64 V25 float64 V26 float64 V27 float64 V28 float64 交易金额 float64 类别标签 int64 dtype:object 缺失值统计:0个缺失值数据加载后首先进行质量检查该数据集较为干净不存在缺失值所有特征均为数值类型无需进行额外的数据清洗操作。二、数据探索在正式建模之前有必要对数据的分布特征进行初步探索。类别不平衡问题从可视化结果中可见一斑通过对比分析可观察到欺诈交易在小额区间的分布密度明显高于正常交易这可能与犯罪分子试探性消费的行为模式有关。三、模型构建与过拟合控制决策树算法因其可解释性强、训练速度快的特点在金融风控领域应用广泛。然而决策树也容易出现过拟合问题特别是在特征维度较高的情况下。3.1 基线模型首先建立一个无约束的基线模型作为参照# 分离特征和目标Xdf.drop([COL_CLASS],axis1);ydf[COL_CLASS];print(f特征矩阵形状:{X.shape});print(f目标向量形状:{y.shape});# 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42,stratifyy); feature_namesX.columns.tolist();print(f\n训练集大小:{X_train.shape[0]});print(f测试集大小:{X_test.shape[0]});print(f训练集欺诈比例:{y_train.sum()/len(y_train)*100:.4f}%);print(f测试集欺诈比例:{y_test.sum()/len(y_test)*100:.4f}%); dt_basicDecisionTreeClassifier(random_state42);dt_basic.fit(X_train,y_train); y_pred_basicdt_basic.predict(X_test);y_prob_basicdt_basic.predict_proba(X_test)[:,1];print(f训练集准确率:{dt_basic.score(X_train,y_train):.4f});print(f测试集准确率:{dt_basic.score(X_test,y_test):.4f});print(fAUC-ROC:{roc_auc_score(y_test,y_prob_basic):.4f});print(f树深度:{dt_basic.get_depth()});print(f叶子节点数:{dt_basic.get_n_leaves()});基线模型在训练集上达到100%准确率而测试集准确率为99.91%树深度达到26层。这种表现明显存在过拟合迹象需要进行正则化处理。3.2 正则化模型通过限制树的最大深度和节点最小样本数可以有效控制模型复杂度# 限制深度的决策树防止过拟合。dt_limitedDecisionTreeClassifier(max_depth5,min_samples_split20,min_samples_leaf10,random_state42);dt_limited.fit(X_train,y_train); y_pred_limiteddt_limited.predict(X_test);y_prob_limiteddt_limited.predict_proba(X_test)[:,1];print(f训练集准确率:{dt_limited.score(X_train,y_train):.4f});print(f测试集准确率:{dt_limited.score(X_test,y_test):.4f});print(fAUC-ROC:{roc_auc_score(y_test,y_prob_limited):.4f});print(f树深度:{dt_limited.get_depth()});print(f叶子节点数:{dt_limited.get_n_leaves()});正则化后的模型树深度降至5层叶子节点数缩减至20个AUC-ROC指标达到0.9013泛化能力显著提升。四、类别不平衡问题的处理策略对于欺诈检测这类不平衡分类问题准确率并非理想的评估指标。即便模型将所有样本预测为正常也能达到99.8%的准确率但这显然没有实际价值。4.1 类别权重调整Scikit-learn提供了class_weight参数可自动根据类别频率调整损失函数的权重# 类别权重平衡的决策树。 dt_balanced DecisionTreeClassifier( max_depth5, min_samples_split20, min_samples_leaf10, class_weightbalanced, random_state42 ); dt_balanced.fit(X_train, y_train); y_pred_balanced dt_balanced.predict(X_test); y_prob_balanced dt_balanced.predict_proba(X_test)[:, 1]; print(f训练集准确率: {dt_balanced.score(X_train, y_train):.4f}); print(f测试集准确率: {dt_balanced.score(X_test, y_test):.4f}); print(fAUC-ROC: {roc_auc_score(y_test, y_prob_balanced):.4f}); print(fAverage Precision: {average_precision_score(y_test, y_prob_balanced):.4f});引入类别权重后AUC-ROC从0.9013提升至0.9166。在PR曲线Precision-Recall Curve的评估框架下Average Precision达到0.4498这一指标对于不平衡数据集具有更强的参考价值。4.2 超参数网格搜索为进一步优化模型性能采用GridSearchCV进行系统性的超参数搜索param_grid { max_depth: [3, 5, 7, 10], min_samples_split: [10, 20, 50], min_samples_leaf: [5, 10, 20], class_weight: [balanced, None] }; dt DecisionTreeClassifier(random_state42); # 使用PR-AUC作为评分标准更适合不平衡数据。 grid_search GridSearchCV( dt, param_grid, scoringaverage_precision, cv3, n_jobs-1, verbose1 ); print(开始网格搜索...); grid_search.fit(X_train, y_train); print(f\n最佳参数: {grid_search.best_params_}); print(f最佳交叉验证得分: {grid_search.best_score_:.4f}); best_model grid_search.best_estimator_;网格搜索共遍历72组参数组合最终确定的最优配置为max_depth10、min_samples_leaf5、min_samples_split10、class_weightNone。值得注意的是在此参数空间下未使用类别权重的配置反而获得了更好的交叉验证表现这说明正则化参数与类别权重之间存在交互效应。五、模型评估与业务解读5.1 评估指标选择在欺诈检测场景中召回率Recall通常比精确率Precision更为重要——漏检一笔欺诈交易的代价往往远高于误报一笔正常交易。因此在模型评估阶段需要综合考虑以下指标AUC-ROC衡量模型区分正负样本的整体能力Average PrecisionPR曲线下面积对不平衡数据更为敏感F1-Score精确率与召回率的调和平均混淆矩阵直观展示各类预测结果的数量分布5.2 特征重要性分析决策树的一个显著优势在于其可解释性。通过feature_importances_属性可以获取各特征对模型决策的贡献度--- 特征重要性 (前10名) --- 特征 重要性 V17 0.658510 V14 0.109977 V12 0.056633 V10 0.056024 V27 0.036131 V26 0.021336 V4 0.012460 V16 0.012193 V28 0.008701 交易频率 0.006995从特征重要性排序结果来看V14、V10、V12等主成分对欺诈识别贡献最大而交易频率时间和交易金额的相对重要性较低。这一发现与PCA降维的初衷相符——原始特征经过线性变换后关键信息已被浓缩至特定主成分中。本项目完整展示了决策树在信用卡欺诈检测中的应用流程核心要点可归纳如下数据层面不平衡分类问题需要采用专门的采样策略或类别权重调整避免模型偏向多数类模型层面决策树的正则化参数max_depth、min_samples_leaf等对泛化性能影响显著需通过交叉验证谨慎选择评估层面准确率在不平衡场景下具有误导性应优先采用AUC-ROC、Average Precision等指标后续优化可考虑以下方向集成方法尝试Random Forest或XGBoost等集成模型进一步提升预测稳定性代价敏感学习引入业务层面的误分类代价矩阵构建更符合实际风险偏好的决策边界实时推理优化针对线上风控场景探索模型压缩和特征工程优化方案本文涉及的完整代码和数据集可在GitHub仓库中获取欢迎交流讨论。