从零构建CART决策树模型:信贷风险预测实战指南

1次阅读
没有评论

共计 2512 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景与痛点

信贷风险预测是金融机构核心业务之一,直接关系到贷款违约率和资金安全。传统人工审核效率低且主观性强,而机器学习能自动发现数据中的风险模式。但新手常面临三大挑战:

从零构建 CART 决策树模型:信贷风险预测实战指南

  • 数据维度多:收入、负债、历史信用等数十项特征需要有效整合
  • 样本不均衡:违约样本通常不足 5%,导致模型偏向多数类
  • 可解释性要求:监管要求必须能解释拒贷原因

技术选型对比

  1. 逻辑回归
  2. 优势:计算简单,输出概率直观
  3. 局限:难以捕捉非线性关系,对特征工程依赖强

  4. 随机森林

  5. 优势:自动特征选择,抗过拟合能力强
  6. 局限:模型复杂度高,可解释性较差

  7. CART 决策树

  8. 核心优势:
    • 可视化决策路径(符合监管要求)
    • 自动处理混合类型特征
    • 对数据分布假设较少
  9. 典型应用场景:
    • 需要白盒模型的金融场景
    • 中等规模数据集(万级样本)

实现步骤详解

数据预处理

模拟一份包含 10000 条记录的信贷数据集:

import pandas as pd
import numpy as np

# 模拟特征:年龄、收入、负债比、信用分、逾期次数
np.random.seed(42)
data = pd.DataFrame({'age': np.random.randint(18, 70, 10000),
    'income': np.random.lognormal(mean=10, sigma=0.5, size=10000),
    'debt_ratio': np.random.beta(a=2, b=5, size=10000),
    'credit_score': np.random.normal(loc=650, scale=100, size=10000),
    'delinquencies': np.random.poisson(lam=0.5, size=10000)
})

# 生成标签:违约概率 =1/(1+e^-(0.1* 年龄 -0.5* 负债比 -0.01* 信用分))
data['default'] = 1 / (1 + np.exp(-(0.1 * data['age'] - 
    0.5 * data['debt_ratio'] - 
    0.01 * (data['credit_score'] - 650)
))) > 0.3  # 阈值设为 30%

关键处理步骤:

  1. 缺失值处理:

    # 用中位数填充数值特征
    data.fillna(data.median(), inplace=True)

  2. 特征分箱:

    # 将连续年龄离散化为 5 个区间
    data['age_group'] = pd.cut(data['age'], bins=5, labels=False)

  3. 数据标准化:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    data[['income', 'credit_score']] = scaler.fit_transform(data[['income', 'credit_score']])

模型训练

使用 scikit-learn 实现:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# 划分特征和标签
X = data.drop('default', axis=1)
y = data['default']

# 按 7:3 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)

# 初始化决策树(限制最大深度防止过拟合)clf = DecisionTreeClassifier(
    max_depth=4, 
    min_samples_leaf=50,
    criterion='gini', 
    random_state=42
)

# 训练模型
clf.fit(X_train, y_train)

模型评估

选择适合不均衡数据的指标:

from sklearn.metrics import classification_report

# 预测测试集
y_pred = clf.predict(X_test)

# 输出评估报告
print(classification_report(y_test, y_pred, target_names=['正常', '违约']))

# 输出特征重要性
print("特征重要性:")
for name, importance in zip(X.columns, clf.feature_importances_):
    print(f"{name}: {importance:.2f}")

性能优化技巧

  1. 过拟合防范
  2. 设置 max_depth 参数(通常 3 - 6 层)
  3. 增加min_samples_split(建议≥50)
  4. 使用剪枝参数ccp_alpha

  5. 处理样本不均衡

    # 调整类别权重
    clf = DecisionTreeClassifier(class_weight={0:1, 1:5})

  6. 特征组合

  7. 创建交叉特征如 负债比 / 收入
  8. 对连续特征做分箱处理

避坑指南

  • 陷阱 1 :直接使用原始特征
  • 解决:对收入等长尾分布取对数

  • 陷阱 2 :忽略特征相关性

  • 解决:计算相关系数矩阵,移除相关系数 >0.8 的特征

  • 陷阱 3 :使用准确率评估不均衡数据

  • 解决:优先看召回率(Recall)和 AUC-ROC

实践建议

  1. 尝试不同的分裂标准(gini vs entropy)
  2. 用 GridSearchCV 搜索最优参数组合
  3. 可视化决策树辅助业务解释:
    from sklearn.tree import plot_tree
    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(12,8))
    plot_tree(clf, feature_names=X.columns, 
              class_names=['正常','违约'], filled=True)
    plt.show()

思考延伸

  1. 当出现新特征(如社交媒体数据)时,如何调整模型结构?
  2. 对于不同地区的借款人,是否需要训练独立模型?
  3. 如何将模型预测结果转化为可执行的信贷策略?

通过这个实战流程,你应该已经掌握了 CART 决策树在信贷风控中的核心应用方法。建议从本文的模拟数据出发,逐步替换真实业务数据,观察模型表现的变化。

正文完
 0
评论(没有评论)