【附Python源码】基于决策树的信用卡欺诈检测实战

0 阅读7分钟

【附Python源码】基于决策树的信用卡欺诈检测实战

⚠️完整源码地址:github.com/anjuxi/Deci…

在金融科技领域,欺诈检测始终是风控系统的核心模块之一。

信用卡欺诈检测属于典型的二分类问题,但其特殊性在于类别分布的严重失衡。本项目采用的数据集包含284,807条交易记录,其中正常交易284,315条,欺诈交易仅492条,欺诈样本占比不足0.2%。

数据集形状: (284807, 31)
​
前5行数据:
   交易频率        V1        V2        V3        V4        V5        V6        V7  \
0   0.0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   
1   0.0  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   
2   1.0 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   
3   1.0 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   
4   2.0 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   
​
         V8        V9  ...       V21       V22       V23       V24       V25  \
0  0.098698  0.363787  ... -0.018307  0.277838 -0.110474  0.066928  0.128539   
1  0.085102 -0.255425  ... -0.225775 -0.638672  0.101288 -0.339846  0.167170   
2  0.247676 -1.514654  ...  0.247998  0.771679  0.909412 -0.689281 -0.327642   
3  0.377436 -1.387024  ... -0.108300  0.005274 -0.190321 -1.175575  0.647376   
4 -0.270533  0.817739  ... -0.009431  0.798278 -0.137458  0.141267 -0.206010   
​
        V26       V27       V28    交易金额  类别标签  
0 -0.189115  0.133558 -0.021053  149.62     0  
1  0.125895 -0.008983  0.014724    2.69     0  
2 -0.139097 -0.055353 -0.059752  378.66     0  
3 -0.221929  0.062723  0.061458  123.50     0  
4  0.502292  0.219422  0.215153   69.99     0  
​
[5 rows x 31 columns]
​
数据类型:
交易频率    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 个缺失值

数据加载后首先进行质量检查:该数据集较为干净,不存在缺失值,所有特征均为数值类型,无需进行额外的数据清洗操作。

二、数据探索

在正式建模之前,有必要对数据的分布特征进行初步探索。类别不平衡问题从可视化结果中可见一斑:

data_exploration.png

通过对比分析可观察到:欺诈交易在小额区间的分布密度明显高于正常交易,这可能与犯罪分子试探性消费的行为模式有关。

三、模型构建与过拟合控制

决策树算法因其可解释性强、训练速度快的特点,在金融风控领域应用广泛。然而,决策树也容易出现过拟合问题,特别是在特征维度较高的情况下。

3.1 基线模型

首先建立一个无约束的基线模型作为参照:

# 分离特征和目标
X = df.drop([COL_CLASS], axis=1);
y = df[COL_CLASS];
​
print(f"特征矩阵形状: {X.shape}");
print(f"目标向量形状: {y.shape}");
​
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
);
​
feature_names = X.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_basic = DecisionTreeClassifier(random_state=42);
dt_basic.fit(X_train, y_train);
​
y_pred_basic = dt_basic.predict(X_test);
y_prob_basic = dt_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(f"AUC-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_limited = DecisionTreeClassifier(
    max_depth=5,
    min_samples_split=20,
    min_samples_leaf=10,
    random_state=42
);
dt_limited.fit(X_train, y_train);
​
y_pred_limited = dt_limited.predict(X_test);
y_prob_limited = dt_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(f"AUC-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_depth=5,
    min_samples_split=20,
    min_samples_leaf=10,
    class_weight='balanced',
    random_state=42
);
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(f"AUC-ROC: {roc_auc_score(y_test, y_prob_balanced):.4f}");
print(f"Average 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_state=42);# 使用PR-AUC作为评分标准(更适合不平衡数据)。
grid_search = GridSearchCV(
    dt, param_grid, 
    scoring='average_precision',
    cv=3,
    n_jobs=-1,
    verbose=1
);
​
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_depth=10min_samples_leaf=5min_samples_split=10class_weight=None。值得注意的是,在此参数空间下,未使用类别权重的配置反而获得了更好的交叉验证表现,这说明正则化参数与类别权重之间存在交互效应。

五、模型评估与业务解读

5.1 评估指标选择

在欺诈检测场景中,召回率(Recall)通常比精确率(Precision)更为重要——漏检一笔欺诈交易的代价往往远高于误报一笔正常交易。因此,在模型评估阶段需要综合考虑以下指标:

  • AUC-ROC:衡量模型区分正负样本的整体能力

  • Average Precision:PR曲线下面积,对不平衡数据更为敏感

  • F1-Score:精确率与召回率的调和平均

  • 混淆矩阵:直观展示各类预测结果的数量分布

model_evaluation.png

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降维的初衷相符——原始特征经过线性变换后,关键信息已被浓缩至特定主成分中。


本项目完整展示了决策树在信用卡欺诈检测中的应用流程,核心要点可归纳如下:

  1. 数据层面:不平衡分类问题需要采用专门的采样策略或类别权重调整,避免模型偏向多数类
  2. 模型层面:决策树的正则化参数(max_depth、min_samples_leaf等)对泛化性能影响显著,需通过交叉验证谨慎选择
  3. 评估层面:准确率在不平衡场景下具有误导性,应优先采用AUC-ROC、Average Precision等指标

后续优化可考虑以下方向:

  • 集成方法:尝试Random Forest或XGBoost等集成模型,进一步提升预测稳定性
  • 代价敏感学习:引入业务层面的误分类代价矩阵,构建更符合实际风险偏好的决策边界
  • 实时推理优化:针对线上风控场景,探索模型压缩和特征工程优化方案

本文涉及的完整代码和数据集可在GitHub仓库中获取,欢迎交流讨论。